在Laravel的中间件中设置route参数

时间:2019-01-22 16:08:15

标签: laravel model-binding laravel-routing laravel-middleware

我正在开发Laravel应用程序。我正在中间件中进行路由模型绑定。

我有这样的路线

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

这是我的auth.department中间件(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);
    }
}

这是EmployeeController

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

您可以在代码中看到,我正在使用$ department参数从路线中获取部门ID。但是,我不想像这样将整数绑定为参数。

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

使用我当前的代码,它不起作用。我尝试按照以下步骤在中间件中设置route参数,以匹配(绑定模型)操作中的值。

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

但是它不起作用。如何使用中间件中的模型设置/替换路由参数,该模型可以在控制器的动作中绑定到该参数?可能吗?有什么更好的方法?

如果我使用

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

要设置参数,我无法在控制器的操作中设置类型。

store(Department $department)

但这很好

 store(Department $department)

但是我想要这个

store(Department $department)

1 个答案:

答案 0 :(得分:0)

Laravel已经内置了它。它称为路由模型绑定。

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

删除中间件,而将控制器保持原样。 Laravel将在请求中自动使用ID来查找模型并为您提供实例。如果找不到模型,Laravel会为您抛出404响应。