Комментарии 16
Простите, может быть очень бегло прочитал и не понял какой-то особой мысли, но у вас в коде дальше
routes.php
Route::get('Backend\Crud\OrdersResourceController@index');
?
тогда почему нельзя вместо странных биндигов напрямую прописать в роутах этот самый BaseController сразу?
Route::get(“something”, ...)
Потому что таких запросов ресурсов могут быть тысячи (пользователи, заказы...). Зачем мне каждый раз для этого писать контроллер? И как я буду использовать BaseController, когда туда четко не прописаны зависимости.
И с чего это биндинги вдруг странными стали?
Потому что таких запросов ресурсов могут быть тысячи (пользователи, заказы...). Зачем мне каждый раз для этого писать контроллер? И как я буду использовать BaseController, когда туда четко не прописаны зависимости.
И с чего это биндинги вдруг странными стали?
В основном биндинги не странные, кроме ваших.
Вот зачем они тут? Для того, чтобы в роутах написать несуществующий контроллер, а потом придумать его через алиас? Чтобы люди, которые примерно понимают как работает ларавель, но сразу сообразили, где этот чудо-контроллер находится?
Зачем мне каждый раз для этого писать контроллер?
Вопрос дискуссионный, но допустим общий контроллер лучше. Тогда почему бы не расположить эту логику в том самом BaseController, добавив 3 функции вида
protected function getModel(string $controller): object
{
$class = ['OrdersResourceController' => 'Wolf\\Model\\Backend\\Order'][$controller] ?? null;
if ($class) {
return new $class();
}
}
/// или через конфиг
protected function getResourceCollection(string $class): object
{
$path = app_path('etc/crud.json');
if ($this->filesystem->isFile($path)) {
$virtualTypes = json_decode($this->filesystem->get($path), true);
if ($virtualTypes[$class] ?? null) {
return new $virtualTypes[$class]['resourceCollection']();
}
}
}
А почему не хотите создавать классы? Ведь они различные сущности, различные ендпоинты, на что вы экономите?
И да, если год работать на Вордпрессе, то наверное и «архитектура» Вордпресса понравится :)
И да, если год работать на Вордпрессе, то наверное и «архитектура» Вордпресса понравится :)
А кто мешает использовать базовый контроллер, но передавать параметры в роуте?
Route::get('orders', [
'uses' => 'Backend\Crud\BaseController@index',
'model' => 'Wolf\Model\Backend\Order',
'resourceCollection' => 'Wolf\Http\Resources\OrdersCollection',
'jsonResource' => 'Wolf\Http\Resources\OrderResource'
]);
//В контроллере
$request->route->getAction('model')
После такой «архитектуры», не дай Бог попасть работать с таким кодом. Вы хотите с ларавель сделать мадженту. Должен быть эндпоинт зарегистрированный в роутинге, должен быть класс контроллера который вернёт вид, это пример правильного подхода, чем меньше магии — тем лучше
Идея не писать дублирующий код — хороша. Но вот с реализацией через json-конфиг хочется поспорить.
Не прозрачно получилось. Когда придет новый разработчик, надо ему объяснить, что для реализации стандартных КРУД'ов надо в json'чик добавить несколько строк конфига. А если забыть это сделать, то большинство без зазрений совести сделают artisan make:controller, и в общем-то будут правы.
И да, если в вашем случае потребуется некий специфический метод для одной сущности, то всё равно придется добавлять новый контроллер.
На мой взгляд, реализовать некий КРУД-сервис, который будет реализовывать нужные методы, а в основных контроллерах по сущностям инжектить этот сервис, и в методах контроллера вызывать 1 метод сервиса. Такое решение хотя бы у новых людей не будет вызывать оторопь.
Не прозрачно получилось. Когда придет новый разработчик, надо ему объяснить, что для реализации стандартных КРУД'ов надо в json'чик добавить несколько строк конфига. А если забыть это сделать, то большинство без зазрений совести сделают artisan make:controller, и в общем-то будут правы.
И да, если в вашем случае потребуется некий специфический метод для одной сущности, то всё равно придется добавлять новый контроллер.
На мой взгляд, реализовать некий КРУД-сервис, который будет реализовывать нужные методы, а в основных контроллерах по сущностям инжектить этот сервис, и в методах контроллера вызывать 1 метод сервиса. Такое решение хотя бы у новых людей не будет вызывать оторопь.
Я не говорю, что такой подход является единственно-верным. Но первое, что надо делать с новичком — это вводить его в курс дела. Мол, можешь делать и контроллеры, но за это тебе по жопе надаем, вот мы придумали так — пиши так. И все. Я все таки думаю, что если на проекте 1-2 мидла/сениора решили, что так будет лучше, то джунам нужно так делать. :)
Таки этот подход я тоже не с потолка взял.
Таки этот подход я тоже не с потолка взял.
cmd+пкм уже не сработает, cmd+n подавно.
Для команды разработчиков и крупного проекта, виртуализация — та еще головная боль.
Через месяц не найдешь концов.
Для одиночек и фанатов мадженты, ок.
Для команды разработчиков и крупного проекта, виртуализация — та еще головная боль.
Через месяц не найдешь концов.
Для одиночек и фанатов мадженты, ок.
Почему просто, не использовать Template Method, например?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем меньше дублирующего кода, используя биндинг в Laravel