Ajuste del parámetro de ruta en el middleware en laravel

Pregunta hecha: hace 8 meses Ultima actividad: hace 8 meses
up -1 down

Estoy desarrollando una aplicación laravel. Estoy haciendo vinculante en el middleware modelo de ruta.

Tengo las rutas como esta

Route::group([ 'prefix' => 'department/{department}', 'middleware' => [ 'auth.department' ] ], function () {
    Route::post('employee/create', '[email protected]')->name('employees.store');
});

Este es mi auth.department middleware (AuthDepartment)

class AuthDepartment
{
    public function handle($request, Closure $next)
    {
        $department = Department::find($request->department);
        //do something with the department
        //I want to set the $department (Department model) in the place of {department} in the route.


        return $next($request);
    }
}

Esta es EmployeeController

class EmployeeController extends Controller {
    public function store($department)
    {
    }
}

Como se puede ver en el código, estoy usando el parámetro $ departamento para obtener el ID de departamento de la ruta. Pero en vez de conseguir el número entero como parámetro, quiero obligar a la modelo como este.

class EmployeeController extends Controller {
     public function store(Department $department)
     {
     }
}

Con mi código actual, no está funcionando. Probé para establecer el parámetro de ruta en el middleware como seguimiento para que coincida con (modelo bind) el valor en la acción.

$request->route()->setParameter('department', $department)

Pero no está funcionando. ¿Cómo puedo configurar/cambiar el parámetro de ruta con un modelo en el software intermedio que puede ser enganchan al parámetro en la acción del controlador? ¿Es posible? Lo que podría ser el mejor enfoque?

Si usara

$request->route()->setParameter('department', $department)

para establecer el parámetro, no puedo establecer el tipo en la acción del controlador como este.

store(Department $department)

Pero esto está muy bien

 store(Department $department)

Pero quiero que esta

store(Department $department)

1 respuesta

up 0 down

Laravel ya ha construido en este. Se llama Encuadernación Ruta Modelo.

https://laravel.com/docs/5.7/routing#route-model-binding

Retire el middleware y en lugar de mantener su control como es. Laravel utilizará automáticamente el ID de la solicitud para encontrar el modelo y le dará una instancia de ella. Si no se puede encontrar el modelo, laravel arrojará una respuesta 404 para usted.