【问题标题】:Passing objects to a laravel middleware将对象传递给 laravel 中间件
【发布时间】:2015-12-12 18:22:10
【问题描述】:

根据documentation,中间件可以参数化routes文件中使用静态值:

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

如果我需要传入一个服务怎么办?


我这样做的动机是避免使用 Facades,因为即使它们应该是可模拟的,但我在第一次尝试时就遇到了问题。 Mockery/mockery 做了一些疯狂的评估工作,我不想调试它。本质上,某些类被声明了两次,PHP 因致命错误而窒息。发生这种情况可能是因为我错误地遵循了这个例子,但让我们把它留在那里。我不想依赖 Facades。

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


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

【问题讨论】:

  • 顺便说一句,门面是不可模拟的,因为它有一个静态方法(不是我的代码!)而不是通过门面访问器委托给服务。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2018-01-05
    相关资源
    最近更新 更多