1 - Tipo fiz uma sequência aqui de mudanças no código, a lógica ficaria mais ou menos assim?
-
app/TweetPostRequest
Faço as validações no campos que chegam da request. username e body. No username eu faço a validação se é requerido, se tem espaço e se começa com '@'. No body eu faço a validação se é requerido somente;
-
app/Http/Controllers/TweetController
No método store eu instancio a classe Service/TweetPost passando no construct dela o TweetRepository depois chamando o metodo post dela e passando o body e username da request. Ex:
$tweetPost = new TweetPost($tweetRepository); $tweetPost->store($request->username, $request->body);
-
Pego o método da Trait e coloco na classe Service/TweetPost;
-
Em relação aos Repository eu deixo ele fazendo só a função de receber os dados a instância do Model e fazendo o store.
Não sei se ficou claro pra voce mas existem validaçoes de request mas também existem validacoes de regra de negocio. Um tweet ter 280 chars ou o usernam ter um @ podem acabar sendo validacoes de negocio (vou chamar essas validacoes de validacoes da camada de domínio). Estamos fazendo isso pra garantir que um tweet nao seja salvo com mais de 280 chars por exemplo, atraves de outro endpoint ou cron job. Algumas podem podem acabar se repetindo, não vejo muito problema.
Sim . Você pode começar com esse código que você citou, mas dá uma olhada nesse link sobre Inversion of Control do Laravel. Você vai chegar na conclusão de que ele vai instanciar esse objeto pra você e passar no construtor do seu controller.
Sim, é uma das formas de se resolver. Acho que a trait perdeu a importância então você pode colocar isso dentro do TweetPost. Outra coisa que você também pode fazer é acreditar que o próprio objeto tweet tem a capacidade de entender quais são suas hashtags, então voce teria um metodo getHashtags e ele mesmo faria esse trabalho. Mas podemos deixar isso pra outro dia, siga com a primeira opção se tiver mais confortável.
Sim, os repositórios estão lá mais pra ajudar o resto do sistema a resolver problemas que não são regra de negócio. Por exemplo só encapsular a persistência dos dados. https://martinfowler.com/eaaCatalog/repository.html