LARAVEL:: Compartilhando variáveis de forma simples com VIEW COMPOSER

Logo Laravel

LARAVEL:: Compartilhando variáveis de forma simples com VIEW COMPOSER

Você sabe o que é View Composer?
Imagine a seguinte situação: Você está criando um pequeno sistema web que permite ao usuário fazer o cadastro dos seus clientes. Lá, ele precisa definir o endereço, e seria muito comum você melhorar a usabilidade por ao menos permitir que o usuário selecione um dos estados. Então talvez você definisse um select contendo todos os estados.

Imagine-se agora, você precisando criar um formulário para o cadastrar fornecedores, fabricantes, etc. Daí, para cada um destes você deve permitir o cadastro do endereço, selecionando o estado em um select.

Para isso, talvez você guardasse os nomes e/ou siglas dos estados em uma variável tipo array (talvez associativa) e faria um loop com foreach para preencher estes selects no blade.

Talvez a ideia de estados não tenha sido tão tocante assim, mas para que isso seja mais convincente, imagine-se ter de fazer uma consulta ao banco para preencher selects e outros itens em um formulário ou mesmo pela página, que irá se repetir muitas vezes, em partes diferentes do seu código!

Em algum momento isso ficaria pouco produtivo e muito chato! Mas é claro que se não existisse o View Composer, você continuaria fazendo sem reclamar! 😀

O View Composer é um recurso no Laravel que te permite compartilhar uma variável com uma ou mais Views. Logo você poderá imaginar muitos usos para este recurso.

Existem formas diferentes de se contruir e a melhor delas dependerá de sua necessidade. Neste breve artigo, mostrarei a maneira mais simples.

Para este tipo de definição, no Laravel precisamos construir as instruções em um service provider. Neste momento, para ilustrar, vamos usar um service provider já existente: AppServiceProvider

OBS: Se você for utilizar poucas variáveis ou apenas uma, não vejo problemas. Mas se for criar uma série delas, considere criar um novo service provider.

Abra o arquivo desta classe que fica em app\Providers, arquivo AppServiceProvider.php.

Imediatamente você irá se deparar com dois métodos: boot e register.

Para essa façanha, precisamos implementar o código no método boot, e ficará bem simples criar uma array contendo estes 5 estados. Tudo começa assim:


Public function boot(){

    view()->composer('form.*', function($view){
 
    });

}

Olhe para este código acima e note o seguinte: primeiro, estamos utilizando um helper do Laravel de view() para construir nossa instrução. O método composer, a principio recebe dois parâmetros, um primeiro onde definiremos qual ou quais views receberão uma cópia dos do dados e o segundo parâmetro é uma função de call-back, onde contruiremos a instrução.

O primeiro argumento pode receber strings da seguinte forma: ‘clientes.*’ onde form é o diretório ou pasta que contem as views que receberão a composição e * diz que serão todas neste diretório. Mas você também poderia apenas preencher como ‘clientes.form’. Além disso, aqui neste parâmetro, aceita se também variáveis do tipo array contendo, os nomes de cada view.

O segundo parâmetro é onde construiremos a lógica. Note que a closure já nos entrega um objeto $view, onde chamaremos o método with.
Veja como ficaria nesse caso (Apenas a closure):


function($view) {
	
     $estados = ['SP' => 'São Paulo', 'PN'=> 'Paraná', 'AM' => 'Amazonas', 'GO' => 'Goiás', 'CE' => 'Ceará' ];

     $view->with('estados', $estados);
}

Fácil até aí? Moleza! Novamente, entendo que o exemplo com estados poderá não ser tão convincente, ainda mais usando uma simples array com cinco elementos.
Mas, imagine agora substituir este array por uma consulta ao banco que resultaria pelo menos 25 a 50 itens. Sendo que, esta consulta precisasse de varias junções com outras tabelas?!
Percebeu? O método view, sempre irá levar uma variável com aquele conteúdo para as views que forem declaradas no primeiro parâmetro da view composer. Isso quebra uma árve

Note o conjunto completo:



Public function boot(){

    view()->composer('clientes.*', function($view) {

        $estados = ['SP' => 'São Paulo', 'PN'=> 'Paraná', 'AM' => 'Amazonas', 'GO' => 'Goiás', 'CE' => 'Ceará' ];
     
        $view->with('estados', $estados);

    });
}

Feito isso pode construir sem medo em seu formulário blade:


<select name="estado">

     @foreach($estados as $sigla => $estado)
    
	<option value="{{ $sigla }}" >{{ $estado }}</option>
    
     @endforeach

</select>

Poderia fazer o mesmo para cidades de um estado, por exemplo:



Public function boot(){

    view()->composer('clientes.*', function($view) {

        $cidades = DB::table('cidades')->where('estado', 'sp')->pluck('sigla', 'nome');
     
        $view->with('cidades', $cidades);

    });
}

E assim, sucessivamente!

Preciso dizer que existe sim um outro método ainda mais simples de se compartilhar variáveis, com view share, mas não será recomendado para muitas situações.
Porque este método compartilha variáveis de maneira global, então todas as suas views receberão uma cópia da variável. Mas não preciso nem dizer porque isso não será sempre prudente.
Para compartilhar estados com view share, seria dessa maneira:



Public function boot(){

    view()->share('estados', ['SP' => 'São Paulo', 'PN'=> 'Paraná', 'AM' => 'Amazonas', 'GO' => 'Goiás', 'CE' => 'Ceará' ]);
}

E isso é tudo por hora! Existe ainda uma outra maneiras mais complexas, usando uma classe, mas ficará para novo artigo!
[]’s

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.