Pull to refresh

Comments 16

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


Route::get('Backend\Crud\OrdersResourceController@index');

?
тогда почему нельзя вместо странных биндигов напрямую прописать в роутах этот самый BaseController сразу?

Route::get(“something”, ...)

Потому что таких запросов ресурсов могут быть тысячи (пользователи, заказы...). Зачем мне каждый раз для этого писать контроллер? И как я буду использовать 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')
Это далеко не верный подход, т.к мы занимаемся логикой в роутах, чего там быть не должно.

А указание Backend\Crud\OrdersResourceController@index в роутах — это уже не логика?
При этом найти OrdersResourceController невозможно потому что он не существует. Думай потом откуда ноги растут.

После такой «архитектуры», не дай Бог попасть работать с таким кодом. Вы хотите с ларавель сделать мадженту. Должен быть эндпоинт зарегистрированный в роутинге, должен быть класс контроллера который вернёт вид, это пример правильного подхода, чем меньше магии — тем лучше
Причем тут виды?

О «подходе» ларавель можно годами рассуждать. Один AR чего стоит.
А причем тут eloquent к архитектуре лары?
"чем меньше магии — тем лучше"

да… это точно про Laravel)


Простите, просто глаз зацепился. Безотносительно основной части сообщения.

Идея не писать дублирующий код — хороша. Но вот с реализацией через json-конфиг хочется поспорить.

Не прозрачно получилось. Когда придет новый разработчик, надо ему объяснить, что для реализации стандартных КРУД'ов надо в json'чик добавить несколько строк конфига. А если забыть это сделать, то большинство без зазрений совести сделают artisan make:controller, и в общем-то будут правы.

И да, если в вашем случае потребуется некий специфический метод для одной сущности, то всё равно придется добавлять новый контроллер.

На мой взгляд, реализовать некий КРУД-сервис, который будет реализовывать нужные методы, а в основных контроллерах по сущностям инжектить этот сервис, и в методах контроллера вызывать 1 метод сервиса. Такое решение хотя бы у новых людей не будет вызывать оторопь.
Я не говорю, что такой подход является единственно-верным. Но первое, что надо делать с новичком — это вводить его в курс дела. Мол, можешь делать и контроллеры, но за это тебе по жопе надаем, вот мы придумали так — пиши так. И все. Я все таки думаю, что если на проекте 1-2 мидла/сениора решили, что так будет лучше, то джунам нужно так делать. :)

Таки этот подход я тоже не с потолка взял.
cmd+пкм уже не сработает, cmd+n подавно.
Для команды разработчиков и крупного проекта, виртуализация — та еще головная боль.
Через месяц не найдешь концов.

Для одиночек и фанатов мадженты, ок.
Почему просто, не использовать Template Method, например?
Sign up to leave a comment.

Articles