Laravel — A mágica do Route Model Bind
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…

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:
Então o registro retornado não seria mais o mesmo:

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!
