nepster-web
@nepster-web

Как изолировать active record в laravel5?

Задался вопросом, как безопасно изолировать модели AR и гонять их по приложению, по сервисам, возвращать из репозиториев и тп. ?

Недавно я понял, как не много налажал с архитектурой приложения. Дело в том, что я распылил модели AR по всему проекту, не смотря на то, что я использовал репозитории (как оказалось не правильно).

К примеру у нас есть простой код:
$types = Type::with('fields')->get();

Мы берем некие типы из хранилища. Предположим сейчас это AR, а завтра это REST API или Query Builder, в общем результат будет разный. Тоесть в первом случае AR, по втором массив, в третьем коллекция. Не хорошо.

Я бы хотел это все дело привести к одному формату и:
- не боятся, что кто-то умышленно или случайно сделать $type->save() в любом месте проекта
- возвращать единый тип данных из репозитория
- уйти от логики AR, и передавать в виды и между сервисами просто данные (типа как через DTO)

На выручки приходят коллекции:
$type = Type::findOrFail($id);
        collect($type);


С одной сущностью это хорошо работает, однако когда есть скажем реляции:
$types = Type::with('fields')->get();
collect($types->toArray());


То выходит, что все вложенные реляции это просто массив, тоесть не каждая запись в реляции является коллекций, а что-то такое:
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [alias] => test1
                    [name] => Новости
                    [description] =>   
                    [fields] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 1
                                    [type_id] => 1
                                    [type] => test
                                    [is_required] => 1
                                    [validation] => 1
                                )

                        )

                )

            [1] => Array
                (
                    [id] => 2
                    [alias] => test2
                    [name] => Статьи
                    [description] =>   
                    [fields] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [type_id] => 2
                                    [type] => test
                                    [is_required] => 1
                                    [validation] => 2
                                )

                        )

                )

            [2] => Array
                (
                    [id] => 3
                    [alias] => test3
                    [name] => Вакансии
                    [description] =>  
                    [fields] => Array
                        (
                        )

                )

        )

)


Тоесть записи внутри реляции fields, просто массив, а не вложенная коллекция.

Интересует следующие 2 вопроса:
- Правильно ли будет заморочиться с изоляцией AR используя DOT или коллекции ?
- Нужно писать свой обработчик коллекций, который будет конвертировать модель с реляциями рекурсивно в коллекцию со вложенными коллекциями, или есть другой вариант ?
  • Вопрос задан
  • 419 просмотров
Пригласить эксперта
Ответы на вопрос 2
OnYourLips
@OnYourLips
Мы берем некие типы из хранилища. Предположим сейчас это AR, а завтра это REST API или Query Builder, в общем результат будет разный. Тоесть в первом случае AR, по втором массив, в третьем коллекция. Не хорошо.
Создайте service layer, пропишите приходящие и возвращаемые типы (можете создать новые non-persistent типы-модели) в методах. А реализация внутри сервиса может меняться, это никого не затронет.

не боятся, что кто-то умышленно или случайно сделать $type->save() в любом месте проекта
Почему? AR так используется.
Вопрос выглядит так, как будто вы хотите просто создать обёртку вокруг AR, создав самодельное подобие DM, но почему бы вам сразу не взять DM?

Правильно ли будет заморочиться с изоляцией AR
Этот (анти)паттерн создавался и популярен при быстрой разработке, изначально нарушая SOLID. С ним обычно не заморачиваются, а клепают маленькие проекты.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы