我是Laravel的新手,正在研究API端点的集合,这些端点从各种数据库表中获取数据,转换和处理该数据,然后将其作为JSON响应返回。通过阅读文档,我要努力决定的是我的处理/转换代码应该位于何处。
我已经在route / api.php中设置了我的路由,并使其指向Controller
子类,但是从这里开始,事情变得有些模糊,因为我目前不打算使用Eloquent ORM 。似乎通常我会为每个数据库表生成Model
子类,并对它们进行Repository
调用并转换返回的数据,就像这样:
Route => Controller => Repository => Model
但是,当不使用Eloquent ORM或Model
范例时,我应该在哪里放置数据库查询代码以及处理/转换该数据所需的逻辑(业务逻辑)?使用数据库查询和逻辑使控制器变得繁琐似乎是一个麻烦的解决方案,但与此同时,许多Laravel数据库示例代码 都将逻辑放置在Controller子类中。
答案 0 :(得分:0)
因此,我将提供一种可以满足您要求的方法。在我开发的API中,我使用了route/api.php
文件来创建API端点。这些每个都指向Controller
,在此执行身份验证和请求验证。然后Controller
调用一个Service
类,该类处理应用程序的所有业务逻辑,而这是真正的繁重工作。 Service
类调用Repository
,实际上执行Model
更改和保存。
几年前,我在另一个项目中看到了它,并为我的项目模仿了它。代码流如下所示。不确定它是否对您有用,但是我发现它非常整洁,并以合乎逻辑的方式将代码分组在一起。
Route => Controller => Service => Repository => Model
答案 1 :(得分:0)
下面是一个示例,说明如何在没有Eloquent
的情况下设置项目。
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;
}
...
}
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.
...
}
}
...
}
最后,您的业务逻辑可以在您的控制器中。您的控制器应使用存储库来获取模型对象,与它们一起使用,并在需要时使用存储库来存储结果。
显然,您将需要为所有实体实现基类/接口。使用依赖注入和Laravel的服务容器将所有内容粘合在一起。
您还可以通过分隔存储库中的查询和映射来扩展此设计-您将拥有Repository
类,这些类仅知道如何检索/存储原始数据,并且您将拥有Mapper
类,它们都可以在记录中创建原始数据/从记录中检索原始数据(并用作存储库,仓库将用于根据查询结果生成记录对象)。如果业务逻辑也需要互换,那么您也可以从控制器中取出业务逻辑,并将其放入控制器可以利用的单独类中。
Here是一篇有关基于存储库的方法以及如何扩展它的出色文章。