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 или коллекции ?
- Нужно писать свой обработчик коллекций, который будет конвертировать модель с реляциями рекурсивно в коллекцию со вложенными коллекциями, или есть другой вариант ?
  • Вопрос задан
  • 423 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

Похожие вопросы