Laravel API 架构 - 最佳实践

3
我正在实现一个API,可以创建客户和联系人。联系人可以与客户相关联。
我已经编写了包含所有CRUD方法的ClientController.php。
我还编写了一个包含所有CRUD方法的ContactController.php。
我想允许在一个API调用中创建联系人并将其分配给客户。
我认为最好的方法是在我的ClientController中添加一个函数,并通过API调用它:/api/client/6/addContact。
public function addContact($clientId, Request $request) {
   $contact = new Contact($request->all())->save();

   $client = Client::find($clientId)->attach($contact->id);

   return response()->json(null, 200);

}

我的问题是添加联系人(以及验证)的方法在ContactController.php中,这样我就重复了代码。如何从ClientController@addContact使用ContactController@store方法?

这种问题有通用的API架构吗?

谢谢!


您可以使用服务模式。在我正在工作的项目中,我创建了一个App\Services命名空间中的纯PHP类,然后将其注入到我的控制器(或其他服务)中以提供功能,并传递任何所需的HTTP数据(如get/post变量)到服务中。 - Nathan
1
@Nathan 或许他应该使用Eloquent观察器,因为他并不想使用第三方库。如果您使用Laravel 5.3或更高版本,则应该使用观察器,因为您正在观察添加客户端方法。欲了解更多信息,请阅读此文档:https://laravel.com/docs/5.3/eloquent#observers - Thamer
@Thamerbelfkih 谢谢你,我已经多次阅读了有关观察者的文章,但从未想过可以使用它来实现这一点。 - Hussein
据我所理解,您已经保存了一个“客户端”,现在想创建一个“联系人”并将其附加到“客户端”。如果是这样,为什么不在“ContactController”的存储方法中调用$client->contacts()->attach($contact->id)呢? - Hussein
谢谢@Nathan,你能给我一个你服务的例子吗?我在Laravel文档中似乎找不到这个模式。 - Ben Southall
2个回答

3

我建议使用嵌套的API资源路由

// generate the controller class
php artisan make:controller Api/ContactController --api

// create the route definitions
Route::apiResource('clients.contacts', 'ContactController');

以上创建了路由:
GET /clients/{client}/contacts
POST /clients/{client}/contacts
GET /clients/{client}/contacts/{contact}
PUT/PATCH /clients/{client}/contacts/{contact}
DELETE /clients/{client}/contacts/{contact}

0

你正在创建一对多的关系。我建议你在 Eloquent 中建立这种关系,然后其他的就会自然而然地落实到位:

https://laravel.com/docs/5.6/eloquent-relationships#one-to-many

当您正确建立关系后,API调用将围绕一个JSON字符串(对象)进行结构化,该字符串将包含一个客户端和一个或多个联系人。

如果您有任何问题,请随时提问,但这种基本策略将帮助您达到目标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接