Laravel — A mágica do Route Model Bind

nicke.dev
nicke.dev
Jul 28, 2017 · 3 min read

O Laravel nos traz um recurso muito interessante junto com seu modelo de injeção de dependências o “Model Bind”. O model bind faz a tradução automática de um ID ou “slug” para uma instância de um model, e como seria isso?

Partindo do principio em que na minha aplicação quero referenciar o Model Customer (App\Customer) e que estou usando a versão 5.4 do framework:

Vamos a uma rota básica no browser:

http://laravelproject.dev/customers/2

Em nosso arquivo de rotas (routes/web.php) isso seria transcrito da seguinte maneira:

Em um caso comum você poderia ir no seu controller e chamar uma instância do model “App\Customer” e fazer um findOrFail, algo desse tipo:

Nós receberíamos uma instancia de Customer de acordo com o “ID” especificado na rota do browser (perceba que não estou referenciando views).


Nada de novo e surpreendente até então, agora vamos utilizar um pouco da mágica do “Route Model Bind”. O framework nos oferece dois tipos de bind:

  • Implícito: Definimos um slug com o mesmo nome da variável que vai receber a instância e o laravel cuida da resolução da injeção de dependência e não precisamos mexer em providers nem em configurações específicas.
  • Explícito: Nós configuramos no app\Providers\RouteServiceProvider todos os vínculos de bind em relação ao slug e o objeto retornado, dessa forma exige um pouco mais de trabalho porém permite ao desenvolvedor ter mais controle sobre o que está sendo retornado.

Vamos ao Implícito:

Em nosso arquivo de rotas vamos substituir o “id” por “{customer}” que será o slug que referenciará o bind com a instância do model Customer. Ficando da seguinte maneira:

Obs.: Lembrando que por padrão o Laravel fará o “findOrFail” em background usando o campo “id” como referência ao slug que definimos.

E agora vamos receber em nosso CustomersController, onde a variável que vai receber tem que ser preferencialmente tem que ser uma instância de Customer com o mesmo nome do slug definido no arquivo de rotas, caso contrário não haverá o retorno esperado:

E a saída no browser? Adivinha…

Senhoras e Senhores, sim é a mesma!

Na documentação tem informações sobre como mudar a referência padrão do slud com o“id” do registro para o campo que você precisar em “Customizing The Key Name”.

A aplicação do bind depende mais da sua imaginação e necessidade para melhor aproveitar a oportunidade, estou tentando demonstrar da forma mais simples possível o conceito.


Agora ao Explícito:

Primeiro vamos informar ao Laravel sobre o que o slug que definimos na rota fará a referência, editaremos o arquivo “app/Providers/RouteServiceProvider.php” no método “boot()”:

Não mudaremos nada nos arquivos anteriores, pois eles receberão a instância do mesmo jeito, a questão é: “Por que utilizar o Explícito em vez do Implícito se o resultado continua o mesmo?

Então, a resposta é CONTROLE. Nem sempre precisaremos fazer referência direta ao id, poderíamos querer um filtro na instância retornada, e com o Explícito poderemos realizar coisas assim e manter o arquivos de rotas mais limpo.

O que fizemos foi alterar a referência do “id” para o sobrenome do Cliente, exemplificando a chamada na barra de endereços do browser:

http://laravelproject.dev/customers/Emerald

Então o registro retornado não seria mais o mesmo:

O cliente listado é o de id=3 em vez do anterior (id=2).

Nesse post não foi tratado nada de novo, porém, como o recurso é interessante e é algo muito bom de ter na memória, as vezes isso passa batido na hora da leitura da documentação e só vamos notar a possibilidade umas 30 leituras posteriores. O Laravel nos traz algumas facilidades na jornada árdua do desenvolvimento da aplicação, em outro momento vou falar sobre o Form Model Bind com o pacote “Laravel Collective”, que trará mais mágica e facilidade nas nossas views em forms de update.

Obrigado pessoal!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade