如何在不使用Eloquent ORM时构建Laravel应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不使用Eloquent ORM时构建Laravel应用程序相关的知识,希望对你有一定的参考价值。

我是Laravel的新手,正在研究一系列API端点,这些端点从各种数据库表中获取数据,转换和处理该数据,然后将其作为JSON响应返回。通过阅读文档,我正在努力决定我的处理/转换代码应该存在的地方。

我已经在routes / api.php中设置了我的路由,让它们指向一个Controller子类,但是从这里开始有点模糊,因为我现在不打算使用Eloquent ORM。通常我会为每个数据库表生成Model子类,并对这些子类进行Repository调用并转换返回的数据,如下所示:

Route => Controller => Repository => Model

但是,在不使用Eloquent ORM或Model范例的情况下,我应该将数据库查询代码和处理/转换数据所需的逻辑(业务逻辑)放在哪里?使用DB查询和逻辑使控制器变胖似乎是一个混乱的解决方案,但同时很多Laravel DB示例代码确实将逻辑放在Controller子类中。

答案

以下是如何在没有Eloquent的情况下设置项目的示例。

  1. 模型只是数据容器(记录)。他们不知道如何或在哪里存放自己。它们使用一些数据进行实例化并为其提供访问权限:
class OrderRecord
{
    protected $id;
    protected $createdAt;

    public function __construct($id, $createdAt = null)
    {
        $this->id = $id;
        $this->createdAt = $createdAt ?: date('d-m-Y H:i:s');
    }

    public function getID()
    {
        return $this->id;
    }

    ...
}
  1. 您只能通过存储库读写模型。存储库只是一个具有检索/写入一个或多个记录(find,findAll,update,delete等)的典型方法的类。它读取数据,用它实例化记录或记录,从中获取数据并写入数据。例如:
class OrderRepository
{
    public function find($id): OrderRecord
    {
        // Here goes your querying. StdClass will be returned in this case
        // that will be used to create new record.
        $row = DB::table('orders')->find($id);

        if ($row) {
            return (new OrderRecord($row->id, $row->created_at));
        } else {
            // If not found you can throw an exception or return null 
            // (return type should be ?OrderRecord then) depending on 
            // how you want to design your workflow with repositories.
            ...
        }
    }

    ...
}
  1. 最后,您的业务逻辑可以在您的控制器中。您的控制器应使用存储库来获取模型对象,使用它们以及使用存储库来存储结果(如果需要)。
  2. 显然,您需要为所有实体实现基类/接口。使用依赖注入和Laravel的服务容器将所有内容粘合在一起。

您还可以通过在存储库中分离查询和映射来扩展此设计 - 您将拥有只知道如何检索/存储原始数据的Repository类,并且您将拥有知道如何在记录中创建/检索原始数据的Mapper类(并充当存储库将用于从查询结果生成记录对象的工厂)。如果业务逻辑也需要可以互换,那么您还可以从控制器中获取业务逻辑,并将其放入控制器可以使用的单独类中。

Here是一篇关于基于存储库的方法以及如何扩展它的优秀文章。

另一答案

所以我会提供一种方法,我认为可以完成你的要求。在我开发的API中,我使用route/api.php文件来创建API端点。其中每个都指向执行身份验证和请求验证的Controller。然后Controller调用Service类来处理应用程序的所有业务逻辑,这些是真正繁重的部分。 Service类调用Repository,它实际上执行Model更改和保存。

几年前我在另一个项目中看到了这个,并为我的项目模仿了它。代码流程如下所示。不确定它是否适合你,但我发现它非常整洁,并保持代码以逻辑方式组合在一起。

Route => Controller => Service => Repository => Model

以上是关于如何在不使用Eloquent ORM时构建Laravel应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM 事务:为啥我们需要 ROLLBACK?

Laravel Eloquent ORM - 选择所有两个关系都不存在的模型时,生成的 SQL 和查询构建器结果不匹配

PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作

PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作

DB门面,查询构建器,Eloquent ORM三者的CURD

在 Laravel 中使用 Eloquent ORM 使用 LIKE 执行数据库搜索