Digamos que sempre que eu faço uma operação CRUD ou modifico um relacionamento de uma maneira específica, também quero fazer outra coisa. Por exemplo, sempre que alguém publica uma postagem, também quero salvar algo em uma tabela para análise. Talvez não seja o melhor exemplo, mas em geral há muito dessa funcionalidade "agrupada".
Normalmente, vejo esse tipo de lógica colocada nos controladores. Tudo bem, até que você queira reproduzir essa funcionalidade em muitos lugares. Quando você começa a usar parciais, criando uma API e gerando conteúdo fictício, torna-se um problema manter os itens secos.
As maneiras que eu já vi para gerenciar isso são eventos, repositórios, bibliotecas e adição de modelos. Aqui estão meus entendimentos de cada um:
Serviços: é aqui que a maioria das pessoas provavelmente colocaria esse código. Meu principal problema com os serviços é que, às vezes, é difícil encontrar funcionalidades específicas e sinto que eles são esquecidos quando as pessoas estão focadas no uso do Eloquent. Como eu sei que preciso chamar um método publishPost()
em uma biblioteca quando posso fazer isso $post->is_published = 1
?
A única condição em que vejo isso funcionando bem é se você APENAS usar serviços (e idealmente tornar o Eloquent inacessível de alguma forma pelos controladores todos juntos).
Por fim, parece que isso criaria apenas um monte de arquivos desnecessários extras se suas solicitações geralmente seguirem a estrutura do seu modelo.
Repositórios: Pelo que entendi, isso é basicamente como um serviço, mas há uma interface para que você possa alternar entre ORMs, dos quais não preciso.
Eventos: Eu vejo isso como o sistema mais elegante em certo sentido, porque você sabe que seus eventos de modelo sempre serão chamados em métodos Eloquent, para que você possa escrever seus controladores como faria normalmente. Eu posso ver isso ficando confuso e se alguém tiver exemplos de grandes projetos usando eventos para acoplamento crítico, eu gostaria de vê-lo.
Modelos: Tradicionalmente, eu tinha aulas que realizavam CRUD e também lidavam com acoplamentos críticos. Isso realmente facilitou as coisas, porque você sabia que todas as funcionalidades do CRUD + tinham que ser feitas com ele.
Simples, mas na arquitetura MVC isso normalmente não é o que vejo feito. Em certo sentido, eu prefiro isso a serviços, pois é um pouco mais fácil de encontrar e há menos arquivos para acompanhar. Pode ficar um pouco desorganizado. Eu gostaria de ouvir quedas nesse método e por que a maioria das pessoas parece não fazer isso.
Quais são as vantagens / desvantagens de cada método? Estou esquecendo de algo?