Как правильнее делать CRUD?

Раньше я всегда совмещал создание и редактирование модели в одном методе, примерно так:

public function actionSave($id = null) {
    $model = $id ? $this->findOneOrFail($id) : new Article();

    if ($model->load(\Yii::$app->request->post()) && $model->validate() && $model->save(false)) {
        \Yii::$app->session->setFlash('success', 'Сохранено');
        return $this->redirect(['article/list']);
    }

    return $this->render('form', ['model' => $model]);
}

Недавно услышал что это не SOLIDно... И типа надо делать отдельный GET метод получения формы, а сохранение и редактирование толи по разным методам, толи в один метод store... Вот хочется услышать объективное мнение как правильно. Нафига дублировать столько кода в угоду паттернам? Когда можно все в один метод залить и будет красиво.

Кстати, еще вопрос, почему метод со списком моделей называют index? Логичнее же list. А метод удаления во многих примерах destroy, хотя казалось бы delete...


Ответы (1 шт):

Автор решения: Alex Khonko

Лучше делать каждый метод отдельно, как вы в принципе сейчас можете увидеть в GII.

Это делается, потому что

  • код в дальнейшем легче доработать
  • нет 100500 if-ов
  • нет даже намёка на какую-то совмещенную логику.

Всё по полочкам, ищи логику ровно в нужном методе, это круто.

Касательно совмещёнки, это плохой тон, такая практика целенаправленно используется только если

  • делать что-то надо очень быстро, и будет рефакторинг
  • нет уверенности, что это нужный функционал, сказали "давайте потестим, и быро там, нам архитектура не нужна"
  • это прототип, который надо только вам.

Вы же в реальной жизни, например, не смешиваете алкоголь по чём зря, мотивируя это как а какая разница то? в желудке же перемешается. Ну а если вам ещё и лекарство пить, так мб тогда и лекарство в общую тару, да, перемешается же?

Это классный подход, как кажется сначала, и классный он на каких-то дешёвых веб студиях, где надо быстро, и за 5 мин. В продукте за такое могут(и будут в 99% случаев) "бить по рукам"


upd, кстати, а вот задумайтесь: чем плох смешанный алкоголь?

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

Так же и в разработке: гавнокод делает "бо-бо"(в нашем случае тех.долг) всегда. Гавнокод в квадрате только усугубляет положение проекта, и зачастую приводит к тому, что правка чего-то лёгенького ВСЕГДА будет огромной, титанически сложной задачей

→ Ссылка