6
respostas

Entendendo e organizando Laravel

Eu gostaria de entender melhor como organizar as coisas dentro do Laravel e também aprender algumas boas práticas para reaproveitar projetos.

É comum quando eu estou usando outro framework (Yii 1.1) eu ter uma base pronta do meu framework para iniciar outro projeto, só copio a pasta base mudo o nome para o do projeto e todas aquelas funções e classes que eu já fiz sempre estarão ali disponíveis.

No Laravel como funciona essa parte, eu não acho que foi abordado essa questão até porque não faz parte do cronograma do curso, mas como eu poderia fazer algo similar com o Laravel, ou no caso deste framework não tem como fazer assim?

Outra dúvida é na hierarquia de pastas.

Tenho a pasta onde ficam os controllers, os middlewares, onde eu devo deixar o arquivo que eu criar com minhas classes e funções?

6 respostas

Oi Max, você pode criar uma pasta dentro de App, mas precisa tomar cuidado para usar corretamente os namespaces e também talvez adaptar seu composer.json para que o Laravel encontre seus arquivos corretamente.

Talvez, como você já faz reuso desses códigos, seja interessante criar pacotes separados, assim você pode integrar com o framework e instalar os pacotes direto pelo composer ao invés de ficar copiando e colando de projeto para projeto.

Você consegue fazer isso de "jogar a pasta em tal lugar e tudo (quase) funciona" no Laravel 5.5 se usar o Service Container do Laravel. O L5.5 resolve automaticamente onde estão essas dependências.

O L5.4 ou anteriores requer o apontamento dessas classes no arquivo app/config/app.php ou via Composer.

Provavelmente sua app deve estar usando alguma função tipo helper. Nesse caso você pode registrá-los diretamente no Composer. Recomendo ler sobre Facades.


Resumo se só quer a parada funcionando e não liga pra teoria:

  1. Crie uma pasta MinhaClasse dentro de App e coloque namespace App\MinhaClasse na sua classe que tiver lá dentro;
  2. Crie um MinhaClasseServiceProvider.php dentro da pasta;
  3. Atualize o app/config/app.php no L5.4 ou anterior ou o composer.json;
  4. Crie a instância, ou faça a Dependency Injection da classe via construct ou method injection e comece a usar/reusar seu código.

Exemplo de ServiceProvider:

<?php

namespace App\MinhaClasse;

use Illuminate\Support\ServiceProvider;

class MinhaClasseServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        // ...
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\MinhaClasse\MinhaClasseInterface', function () {
            return new MinhaClasse();
        });
    }
}

Eu abandonei essa ideia haha.. achei muito complicado isso, to mexendo direto no domínio mesmo, porque eu não entendi esse namespace, o uso dele eu digo.

O namespace parece complicado mesmo, é uma coisa que eu chamaria de "nova" no PHP ainda. Se não me engano veio com o PHP 5.6, coisa assim. Nem todo mundo ainda está habituado. Mas se você aprendeu o básico de java por exemplo, viu o conceito de pacotes, namespace é a mesma coisa. :)

Wanderson, acho que o curso deveria ter dedicado um pouco mais pra explicar esses namespace, no curso só fala pra você mudar o nome mas o professor não aborda o assunto, eu não sei java então não faço ideia do que seja, tanto que eu nem troquei o namespace da minha aplicação, to usando o default que é App, né?

Me parece algo útil esse namespace, só não entendi e não sei usar ele =/ algo que li até falava que eu podia ter dois arquivos com o mesmo nome em namespace diferente (Aqui minha cabeça explodiu)

Eu usando o namespace default, ta la controller onde é pra ta controller, model onde é pra ta model, view onde é pra ta view.. Se eu troco o namespace, tudo ainda ta no mesmo lugar, nada muda, a principio eu imaginei que ele criaria uma pasta com o nome que eu declarei e ficaria tudo dentro dessa pasta e se eu muda-se o namespace da aplicação de novo ele criaria outra pasta, mas quando mudei o namespace, eu não vi acontecer nada..

={ faço parte do mundo que não está habituado hahaha.. eu não sou programador por profissão, eu só crio umas coisas pra mim e faço uns freelances institucionais, eu usava o Yii1.1, estou curtindo de mais o Laravel, mas as dúvidas são infinitas.

Poxa Max, entendi seu problema. Acontece que namespace não é uma coisa do Laravel, mas sim do PHP no geral, por isso talvez não tenha sido explicado direitinho, sabe? Concordo com você que poderia ter algo explicando, mas talvez não de forma aprofundada.

Para ser bem direto, você sabe o conceito da arvore do explorador de arquivos do seu sistema operacional. No windows, temos a raiz de tudo que é o C:/ e a partir dele, temos pastas e subpastas, entendeu até aqui? O namespace é essa arvore, só que de forma virtual,

O namespace App então é a raiz da sua aplicação. Uma subpasta seria a App\Controllers, onde controllers seria essa subpasta, mas lembrando, isso é tudo virtual. Eu estou usando a palavra pasta e subpasta pra você ter uma noção associativa da ideia, mas no fundo, não é bem pasta.

Deu pra entender melhor?