Я реализую 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 для этих типов проблем?
Спасибо!
Я бы предложил использовать вложенный маршрут ресурса 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}
Вы создаете отношения один ко многим. Я бы сосредоточился на установлении этих отношений красноречиво, и тогда все остальное встанет на свои места:
https://laravel.com/docs/5.6/eloquent-relationships#one-to-many
После того, как вы правильно создадите отношения, ваши вызовы API будут структурированы вокруг строки json (объекта), которая будет иметь одного клиента и один или несколько контактов.
Если у вас есть какие-либо вопросы, пожалуйста, задавайте, но эта базовая стратегия приведет вас туда, куда вы хотите.