Какой метод лучше и почему?

Какой вариант лучше?
Мне привычно работать с моделью прямо в контроллере (правда почитал недавно что это очень плохо и т.д, но почему это плохо так и не понял)

Вот простой пример:
PostController
use App\Post;
//...
public function create(Request $request)
{
    //validate...
    $post = new Post;
    $post->slug = $request->slug;
    $post->name = $request->name;
    $post->story = $request->story;
    $post->save();

    return redirect()->back();
}


И недавно увидел один ознакомительный проект где немного все иначе:
PostController
use App\Post;
//...
public function __construct(Post $model)
{
    $this->model = $model;
}

public function create(Request $request)
{
    $post = new $this->model;
    $post->slug = $request->slug;
    $post->name = $request->name;
    $post->story = $request->story;
    $post->save();

    return redirect()->back();
}

Правда это укороченная версия ну а так вот пример:
BlogController
BlogRepository
  • Вопрос задан
  • 688 просмотров
Решения вопроса 1
@D3lphi
Потому что контроллер по своей сути не должен работать с данными, не должен содержать логику. Его задача - принять запрос, возможно, проверить данные на валидность и отдать ответ. Всё! Больше он делать ничего не умеет. Вся бизнес логика должна выноситься в сервисный слой. А из контроллера вы будете лишь вызывать метод этого сервиса и получать ответ. В принципе, в контроллере можно писать логику, если код короткий, тогда, конечно, создавать сервис будет излишним. С данными должен работать репозиторий (как по ссылке, которую вы привели)! Не нужно делать этого в контроллере.
Мне привычно работать с моделью прямо в контроллере

Может быть вам и привычнее, но это не правильно. Контроллеры разрастаются и становятся жирными. Отсюда же вытекает и то, что вам приходится дублировать код.
$post = new Post;
$post->slug = $request->slug;
$post->name = $request->name;
$post->story = $request->story;
$post->save();

Этот кусок вам, возможно, потребуется использовать еще где-то. И да, вот такой способ, если вашей целью является просто вставка данных, юзать не стоит. В этом нет смысла. Лучше воспользоваться методом create() или же insert().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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