Laravel 5:多模型中间件“;“业主”;

Laravel 5:多模型中间件“;“业主”;,laravel,laravel-5,laravel-middleware,Laravel,Laravel 5,Laravel Middleware,我想创建一个中间件来检查经过身份验证的用户是否是项目的所有者。对于单个模型,代码很简单,如下所示: <?php namespace App\Http\Middleware; use Closure; class Owner { public function handle($request, Closure $next) { $id = $request->segments()[1]; //get

我想创建一个中间件来检查经过身份验证的用户是否是项目的所有者。对于单个模型,代码很简单,如下所示:

    <?php namespace App\Http\Middleware;

    use Closure;

    class Owner {

        public function handle($request, Closure $next)
        {
            $id = $request->segments()[1]; //get the id parameter
            $model = Model::find($id); // find the model from DB

            if(!$item)
              return 'not found'; //if item not found

            //check if authenticated user is owner
            if($item->user_id == \Auth::id()){ 
              return $next($request);
            }else{
              return 'not allowed';
            }
        }
    }

您可以将中间件参数用于路由/模型绑定。假设您有一个post资源

您可以定义路线。中间件获取一个参数,该参数描述要检查其所有权的资源

Route::get('/post/{post}', ['middleware' => 'owner:post', 'as' => 'post', 'uses' => 'PostController@showPost']);
然后在RouteServiceProvider.php中绑定模型:

$router->bind('post', function ($value) {
   return Post::where('id', $value)->firstOrFail();
});
最后,您将创建中间件。需要知道的重要一点是,绑定在请求对象中以$request->post的形式可用。由于将资源的名称传递给中间件,因此它将成为handle方法中的第三个参数

public function handle($request, Closure $next, $resource)
{
    if ($request->{$resource}->user_id == \Auth::id()) {
      return $next($request);
    }
    return response('not allowed.', 401);
}
我想您也可以通过编程方式查找资源名称,但使用此方法,您的资源名称和路由可能会有所不同

您可以使用路线和:

以下是中间件(
app/Http/middleware/abortfnotowner.php
):


中间件参数?我更喜欢这个解决方案。我打算用一些非常类似的东西。谢谢