Laravel 5:将Model参数传递给中间件

时间:2015-06-13 17:48:34

标签: laravel laravel-5 middleware

我想将模型参数传递给中间件。根据这个link (laravel 5 middleware parameters) ,我可以在handle()函数中包含一个额外的参数,如下所示:

 public function handle($request, Closure $next, $model)
 {
   //perform actions
 }

你如何在Controller的构造函数中传递它?这不起作用:

public function __construct(){
    $model = new Model();
    $this->middleware('myCustomMW', $model);
}

**注意:**重要的是我可以传递不同的模型(例如ModelX,ModelY,ModelZ)

3 个答案:

答案 0 :(得分:2)

首先确保您使用的是Laravel 5.1。中间件参数在以前的版本中不可用。

现在我不相信你可以将实例化的对象作为参数传递给你的中间件,但是(如果你真的需要这个)你可以传递一个模型的类名,即如果你需要一个特定的实例,那就是主键。

在你的中间件中:

public function handle($request, Closure $next, $model, $id)
{
    // Instantiate the model off of IoC and find a specific one by id
    $model = app($model)->find($id);
    // Do whatever you need with your model

    return $next($request);
}

在您的控制器中:

use App\User;

public function __construct()
{
    $id = 1; 
    // Use middleware and pass a model's class name and an id
    $this->middleware('myCustomMW:'.User::class.",$id"); 
}
  

使用这种方法,您可以将您想要的任何模型传递给中间件。

答案 1 :(得分:0)

解决此问题的更有说服力的方法是在中间件中创建构造函数方法,将模型作为依赖项注入,将它们传递给类变量,然后在handle方法中使用类变量。

要获得验证我的回复的权限,请参阅Laravel 5.1安装中的app / Http / Middleware / Authenticate.php。

对于中间件MyMiddleware,类MyModel的模型$ myModel,执行如下操作:

use App\MyModel;

class MyMiddleware
{
    protected $myModel;

    public function __construct(MyModel $myModel)
    {
        $this->myModel = $myModel;
    }

    public function handle($request, Closure $next)
    {
        $this->myModel->insert_model_method_here()
       // and write your code to manipulate the model methods

       return $next($request);
    }
}

答案 2 :(得分:0)

您不需要将模型传递给中间件,因为您已经可以访问中间件中的模型实例!
假设我们有这样一条路线:

example.test/api/post/{post}

现在在我们的中间件中,如果我们想动态访问该帖子,我们会像这样

$post = $request->route()->parameter('post');

现在我们可以使用此$post,例如$post->id将为我们提供该帖子的ID,或者$post->replies将为我们提供该帖子的回复。