Задать вопрос
@djok2142

Как использовать один и тот же код для создания и редактирования данных в контроллере?

Не так давно перешел на Laravel.
Есть контроллер для редактирования публикаций, публикация имеет 43 поля для заполнения. За создание формы для публикации отвечает метод show(), а за форму редактирования метод edit(). В каждом из методов порядка 600 строк кода, отвечающего за генерирование различных чекбоксов, селектов, инпутов и прочих полей. И получается так, что код в этих двух методах на 95% идентичен, и основное отличие в том, что в методе edit() берутся и подставляются данные из базы данных, а методе show() данные из базы не берутся, а подставляются пустые значения.

Пример конструкции методов:
public function show()
{
    $data['country_html'] = select(config('catalog.country_list'), 'country', '');
    ...
    Много кода
    ...
     return view('ContentAddEdit', $data);
}

public function edit($id)
{
   $row = DB::table('content')->where('id',$id)->first();

    $data['country_html'] = select(config('catalog.country_list'), 'country', $row['country']);
    ...
    Много кода
    ...
     return view('ContentAddEdit', $data);
}

Как бы в данном случае избавиться от дублирования кода и сделать его универсальным, для использования как при добавлении новой публикации так и редактировании существующей. После внесения изменений в метод show(), часто забываю продублировать эти изменения и в метод edit(). В общем очень не удобно когда изменения нужно постоянно дублировать в двух местах.

Думал вынести данный код в отдельный метод и прописать его вызов в методах show() и edit(), но как тогда лучше поступить с массивом $row, так как для метода show() он будет пуст.
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@hello_my_name_is_dany
Backend Developer (Node.js, PHP, C#)
Зависит от много кода. Если там валидация, то вынести это в валидаторы. Если там какая-то бизнес-логика, то в сервисы/модели.
Ответ написан
Комментировать
dima9595
@dima9595
Junior PHP
На мой скромный взгляд я бы сделал так:
1. Не генерировал бы чекбоксы/селекты и т.п. в самом контроллере, а передавал бы необходимые данные из контроллера во view.
2. Как сказали уже ранее - все проверки данных перекинул бы в Request файлы.
3. Опять же, как сказали ранее - весь код, который что-то получает/обрабатывает - закинул бы в отдельные классы/сервисы.
4. Общий код, который используется часто - закинул бы в трейты. Но не переусердствуйте, часто такой трейт становится очень жирным.
5. Можно вынести какой-то общий код всех контроллеров в файл Controller.php.

По сути много путей есть оптимизации спагетти-кода. Главное найти свой =)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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