Отдельный контроллер Laravel для каждого URL-маршрута? - PullRequest
0 голосов
/ 16 мая 2019

Я создаю сервер REST API (на самом деле в Lumen, а не в Laravel) с несколькими конечными точками, которые позволяют выполнять различные операции с такими ресурсами, как пользователи, учетные записи и продукты.Например, вот маршруты, которые я определил для ресурса User:

GET /v1.0/user
POST /v1.0/user
GET /v1.0/user/{username}
PUT /v1.0/user/{username}
DELETE /v1.0/user/{username}

В настоящее время у меня есть все эти маршруты API для определенного ресурса, определенного в одном контроллере.Например, вот мои маршруты для ресурса User:

$router->get('/v1.0/user', 'UserController@listAll');
$router->post('/v1.0/user', 'UserController@createUser');
$router->get('/v1.0/user/{username}', 'UserController@getUser');
$router->put('/v1.0/user/{username}', 'UserController@updateUser');
$router->delete('/v1.0/user/{username}', 'UserController@deleteUser');

Некоторая логика контроллера становится довольно сложной, и теперь я обнаруживаю, что файлы моего контроллера становятся действительно очень длинными.Теперь я думаю, что мне следует использовать отдельный файл контроллера для каждого маршрута, чтобы сделать код более понятным.

Мой вопрос: есть ли какая-то идиома или соглашение, которому я должен следовать в отношении именования файлов / папок или структуры.Должен ли я создать подпапку в разделе «Контроллеры» для каждого ресурса (например: Controllers / User / UserCreateController.php)?Или это вопрос личного выбора?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Вы должны проверить Контроллер одиночного действия , который принимает только метод __invoke() и может обрабатывать один единственный маршрут.

Кстати, обычно я вижу, что когда логика контроллера становится сложной, наступает время для рефакторинга и перемещения этой сложности за пределы контроллера.

0 голосов
/ 19 мая 2019

Вам не нужно создавать подпапки или несколько контроллеров. Используйте один контроллер Пользовательский контроллер , который содержит только точки входа каждого маршрута. Переместите бизнес-логику за пределы контроллера, создав класс или группу классов, которые заботятся о процессе.

Например: Вы можете создать другой каталог Библиотеки в папке приложения и создать класс Пользователь в разделе Библиотеки, который содержит все функции ресурса пользователя.

Приложение / Библиотеки / User.php

namespace App\Libraries;

class User {}

Теперь вы можете получить доступ к этому классу и функциям, используя пространство имен в вашем контроллере пользователя

namespace App\Http\Controllers;

use App\Libraries\User;

class UserController extends Controller {}
...