You are on page 1of 2

Route Model Binding

Recientemente se nos creo la inquietud del trabajo repetitivo de consultar la BD cuando


se inyecta un ID en una ruta o la accin de un controlador. Si eres fiel seguidor de las
buenas prcticas de desarrollo de software, debes saber que existe un principio llamado
DRY (Dont Repeat Yourself), que bsicamente nos alienta a reducir la repeticin de
informacin de todo los tipos.

Normalmente, en una accin de actualizacin, supongamos para el caso en estudio, se


requiere actualizar una factura. Un definicin de la ruta sera la siguiente:

Route::get('invoice/edit/{id}', 'InvoiceController@edit');

Ahora bien, la accin del controlador podra ser codificada de la siguiente forma:

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
$invoice = invoice::findOrFail($id);

$this->authorize('edit', $invoice);

return view('invoices.edit')
->with('invoice', $invoice);
}

Esto nos refiere, que para cada accin en particular, tenemos que injectar el ID, luego
obtener el modelo relacionado al ID proporcionado. Laravel nos provee otra forma de
resolver este dilema, con el Route Model Binding que implementa un mtodo
conveniente, automticamente podemos inyectar la instancia del modelo directamente en
las rutas.

En otras palabras, en lugar de inyectar el ID de la factura, se puede inyectar la instancia


del modelo Invoice que corresponde al ID dado.

Implicita
Existe la forma implicita, en la cual Laravel automaticamente resuelve el modelo
Eloquent definido en las rutas o las acciones del controlador, cuyos nombres de variable
sugeridos por tipo coincidan con el nombre de segmento de la ruta, por ejemplo:

Route::get('api/users/{user}', function (App\User $user) {


return $user->email;
});

Como la variable $user es declarada del tipo modelo Eloquent App\User y el nombre de
la variable $user corresponde al valor de segmento URI {user}, Laravel
automaticamente inyectar la instancia del modelo que tenga un ID igual al que se enva
en URI. Si por algn motivo no se encuentra el ID, se lanzar un error 404.

Explicita

Para registrar la forma explicita, hay que usar el metodo model en la ruta y especificar la
clase para el parametro dado. Se puede definir las formas explicitas en el metodo boot de
la clase RouteServiceProvider.

public function boot()


{
parent::boot();

Route::model('user', App\User::class);
}

Ahora, definimos una ruta que contenga un parametro llamado {user}:

Route::get('profile/{user}', function (App\User $user) {


//
});

Asi, como hemos atado el parametro {user} al model App\User, una instacia de User
ser injectado a la ruta. Entonces, por ejemplo, se podra llamar la ruta profile/1, lo cual
injectar la instancia User desde la base de datos donde el ID sea 1. Al igual que la
forma implicita, sino se encuentra una instancia para el ID dado, se lanzar un error
HTTP 404.

You might also like