我想将模型参数传递给中间件。根据这个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)
答案 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
将为我们提供该帖子的回复。