Скажем, всякий раз, когда я выполняю операцию CRUD или изменяю отношения определенным образом, я также хочу сделать что-то еще. Например, всякий раз, когда кто-то публикует сообщение, я также хочу что-то сохранить в таблице для аналитики. Может быть, не лучший пример, но в целом там много этой "сгруппированной" функциональности.
Обычно я вижу, что этот тип логики помещается в контроллеры. Это все прекрасно, что денди, пока вы не захотите воспроизвести эту функциональность во многих местах. Когда вы начинаете попадать в частичные, создавая API и создавая фиктивный контент, это становится проблемой с сохранением вещей DRY.
Способы, которые я видел для управления, это события, репозитории, библиотеки и добавление к моделям. Вот мое понимание каждого из них:
Службы: Это место, где большинство людей, вероятно, поместит этот код. Моя основная проблема с услугами заключается в том, что иногда трудно найти в них определенную функциональность, и я чувствую, что их забывают, когда люди сосредоточены на использовании Eloquent. Как я узнаю, что мне нужно вызвать метод publishPost()
в библиотеке, когда я могу просто сделать $post->is_published = 1
?
Единственное условие, по которому я вижу, что это хорошо работает, - это ТОЛЬКО использовать службы (и в идеале сделать Eloquent недоступным каким-то образом из контроллеров все вместе).
В конечном итоге кажется, что это просто создаст кучу лишних ненужных файлов, если ваши запросы обычно следуют вашей структуре модели.
Хранилища: Из того, что я понимаю, это в основном как сервис, но есть интерфейс, поэтому вы можете переключаться между ORM, что мне не нужно.
События: Я считаю это самой элегантной системой в некотором смысле, потому что вы знаете, что ваши модельные события всегда будут вызваны методами Eloquent, поэтому вы можете написать свои контроллеры, как обычно. Я вижу, что они становятся грязными, и если у кого-то есть примеры больших проектов, использующих события для критической связи, я бы хотел это увидеть.
Модели: Традиционно у меня были бы классы, которые выполняли CRUD, а также обрабатывали критическую связь. Это действительно облегчило работу, потому что вы знали всю функциональность вокруг CRUD +, что бы ни было, с ней было.
Простой, но в MVC-архитектуре это обычно не то, что я вижу. В некотором смысле, хотя я предпочитаю этот сервис, потому что его немного легче найти, и есть меньше файлов для отслеживания. Тем не менее, это может быть немного дезорганизовано. Я хотел бы услышать обхода этого метода и почему большинство людей не делают этого.
Каковы преимущества/недостатки каждого метода? Я что-то пропустил?