将对象传递给laravel中间件

时间:2015-12-12 18:22:11

标签: php laravel dependency-injection laravel-5 middleware

根据documentation,中间件可能参数化 routes 文件中带有静态值:

Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);

如果我需要传递服务该怎么办?

我这样做的动机是避免使用Facades,因为即使它们应该是可模仿的,我在第一次尝试时已经遇到了问题。 Mockery / mockery做了一些疯狂的评估,我不打算调试它。本质上,一些类被声明两次并且PHP chokes具有致命错误。这可能是因为我错误地遵循了这个例子,但让我们把它留在那里。我不想依赖外墙。

我不想了解为什么Facades很棒,因为构造函数中的依赖声明足以让我开心。

我尝试了跟踪路由动作,但我无法理解Route :: parseAction($ action)中发生了什么。中间件在哪里实例化?是否有标准的方法将对象传递给middewares?

1 个答案:

答案 0 :(得分:1)

如果您希望将服务传递给中间件,则需要将其声明为中间件构造函数的依赖项。作为示例,请查看Laravel应用程序中默认存在的 RedirectIfAuthenticated 中间件 - 它将获取 Guard 对象,您也可以通过 Auth访问该对象门面。

class RedirectIfAuthenticated
{
  /**
   * The Guard implementation.
   *
   * @var Guard
   */
  protected $auth;

  /**
   * Create a new filter instance.
   *
   * @param  Guard $auth
   *
   * @return void
   */
  public function __construct(Guard $auth)
  {
    $this->auth = $auth;
  }

  //rest of the code