MVC (Laravel) где добавить логику

Допустим, всякий раз, когда я выполняю операцию CRUD или изменяю отношения определенным образом, я также хочу делать что-то еще. Например, всякий раз, когда кто-то публикует сообщение, я также хочу что-то сохранить в таблице для аналитики. Может быть, не лучший пример, но в целом есть много этой "сгруппированной" функциональности.

Обычно я вижу этот тип логики в контроллерах. Это все прекрасно, пока вы не захотите воспроизвести эту функцию во многих местах. Когда вы начинаете разбираться в частичках, создавая API и создавая фиктивный контент, становится проблемой сохранять вещи СУХИМЫМИ.

Я видел способы управления этим: события, репозитории, библиотеки и добавление в модели. Вот мое понимание каждого:

Сервисы: Это где большинство людей, вероятно, поместили бы этот код. Моя основная проблема со службами заключается в том, что иногда трудно найти в них определенную функциональность, и я чувствую, что о них забывают, когда люди сосредоточены на использовании Eloquent. Откуда мне знать, что мне нужно вызвать методpublishPost() в библиотеке, когда я могу просто сделать$post->is_published = 1?

Единственное условие, в котором я вижу, что это работает хорошо, это если вы используете ТОЛЬКО сервисы (и в идеале делаете Eloquent недоступным как-то для контроллеров все вместе).

В конечном счете кажется, что это просто создаст кучу лишних ненужных файлов, если ваши запросы в целом соответствуют структуре вашей модели.

Хранилища: Насколько я понимаю, это в основном похоже на сервис, но есть интерфейс, позволяющий переключаться между ORM, которые мне не нужны.

События: Я считаю, что это самая элегантная система в некотором смысле, потому что вы знаете, что события вашей модели всегда будут вызываться с помощью методов Eloquent, поэтому вы можете писать свои контроллеры, как обычно. Я могу видеть, что они становятся грязными, и если у кого-то есть примеры крупных проектов, использующих события для критической связи, я бы хотел это увидеть.

Модели: Традиционно у меня были классы, которые выполняли CRUD, а также обрабатывали критическую связь. Это на самом деле упростило задачу, потому что вы знали все функциональные возможности CRUD +, что бы с ним ни было, все было.

Просто, но в архитектуре MVC это обычно не то, что я вижу. Хотя, в некотором смысле, я предпочитаю это, а не сервисы, так как найти их немного легче, и меньше файлов для отслеживания. Это может стать немного дезорганизованным все же. Я хотел бы услышать недостатки этого метода и почему большинство людей, кажется, не делают этого.

Каковы преимущества / недостатки каждого метода? Я что-то пропустил?

Ответы на вопрос(4)

Ваш ответ на вопрос