不使用雄辩的ORM时如何构造Laravel应用程序

时间:2018-07-19 18:38:20

标签: php laravel laravel-5

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

我已经在route / api.php中设置了我的路由,并使其指向Controller子类,但是从这里开始,事情变得有些模糊,因为我目前不打算使用Eloquent ORM 。似乎通常我会为每个数据库表生成Model子类,并对它们进行Repository调用并转换返回的数据,就像这样:

Route => Controller => Repository => Model

但是,当不使用Eloquent ORM或Model范例时,我应该在哪里放置数据库查询代码以及处理/转换该数据所需的逻辑(业务逻辑)?使用数据库查询和逻辑使控制器变得繁琐似乎是一个麻烦的解决方案,但与此同时,许多Laravel数据库示例代码 都将逻辑放置在Controller子类中。

2 个答案:

答案 0 :(得分:0)

因此,我将提供一种可以满足您要求的方法。在我开发的API中,我使用了route/api.php文件来创建API端点。这些每个都指向Controller,在此执行身份验证和请求验证。然后Controller调用一个Service类,该类处理应用程序的所有业务逻辑,而这是真正的繁重工作。 Service类调用Repository,实际上执行Model更改和保存。

几年前,我在另一个项目中看到了它,并为我的项目模仿了它。代码流如下所示。不确定它是否对您有用,但是我发现它非常整洁,并以合乎逻辑的方式将代码分组在一起。

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

答案 1 :(得分:0)

下面是一个示例,说明如何在没有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. 您只能通过存储库读取和写入模型。存储库只是一个带有典型方法的类,用于检索/写入一个或多个记录(查找,findAll,更新,删除等)。它读取数据,使用其实例化记录或获取记录,从中获取数据并将其写入。例如:
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是一篇有关基于存储库的方法以及如何扩展它的出色文章。