Архитектура Laravel API — лучшие практики

Я реализую API, который может создавать клиентов и создавать контакты. Контакты могут быть связаны с клиентом.

У меня есть свой ClientController.php со всеми методами CRUD.

У меня также есть ContactController.php со всеми методами CRUD.

Я хочу, чтобы контакт был создан и назначен клиенту в одном вызове API.

Я думал, что лучшим способом было бы добавить функцию в мой ClientController и вызывать ее через API: / API / клиент / 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, поэтому я удваиваю код. Как я могу использовать метод ContactController @ store из ClientController @ addContact?

Существует ли общая архитектура API для этих типов проблем?

Спасибо!

1

Решение

Я бы предложил использовать вложенный маршрут ресурса 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}
2

Другие решения

Вы создаете отношения один ко многим. Я бы сосредоточился на установлении этих отношений красноречиво, и тогда все остальное встанет на свои места:

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

После того, как вы правильно создадите отношения, ваши вызовы API будут структурированы вокруг строки json (объекта), которая будет иметь одного клиента и один или несколько контактов.

Если у вас есть какие-либо вопросы, пожалуйста, задавайте, но эта базовая стратегия приведет вас туда, куда вы хотите.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector