Laravel 5从包服务提供商中注册中间件

时间:2015-04-13 07:03:25

标签: php package laravel-5 service-provider laravel-middleware

我正在为Laravel 5开发一个包。
我的软件包包含一个自定义中间件,我想将它添加到我的软件包服务提供商的内核类的$routeMiddleware数组中。
但我似乎找不到办法做到这一点。

我尝试创建一个扩展Kernel类的自定义类,然后我可以将数组与我的数组合并 但是一旦出了构造函数就不可能了。

在L4中你有App :: middleware,但L5中不再提供该功能。

任何解决过这个问题的人都可以帮我解决这个问题吗?

请告诉我,如果我的问题不够明确,那么我可以稍微澄清一下。

6 个答案:

答案 0 :(得分:18)

自从Laravel 5.4(测试高达5.8)以来,您将从服务提供商处拨打以下行。

$this->app['router']->aliasMiddleware('my-package-middleware', \My\Package\Middleware::class);

或者您可以使用app()帮助程序,如下所示。

app('router')->aliasMiddleware('my-package-middleware', \My\Package\Middleware::class);

答案 1 :(得分:14)

在您的包服务提供商中,您可以像这样访问路由器实例:

$this->app['router']

接下来,您可以注册这样的中间件:

$this->app['router']->middleware('middlewareName', 'your\namespace\MiddlewareClass');

将此代码放在服务提供商的注册方法中。

答案 2 :(得分:4)

这是关于Laravel 5.6

/*In your package service provider*/
public function boot()
{
    /** @var Router $router */
    $router = $this->app['router'];
    $router->pushMiddlewareToGroup('web', MyPackage\Middleware\WebOne::class);
}

答案 3 :(得分:0)

您可以通过以下两种方式执行此操作:

  • 在您的普通中间件提供商中注册您的中间件
  • 在服务提供商
  • 中注册中间件

让我们首先在你的src包文件夹中通过create你的TestMiddleware.php文件尝试并将它放在某处,在我的情况下,我把它放在Middle-ware文件夹中,然后将它添加到你的作曲家。像这样的json自动加载器:

"autoload": {

  "psr-4": {
            "Vendor\\Package\\Middleware": "packages/Vendor/Package/src/Middleware"
   }
}

编写一般的中间件:

namespace Vendor\Package\Middleware;

class TestMiddleware {

    public function handle( $request, Closure $next ) {
        echo 'hello, world!';
    }

}

然后将中间件添加到您的主项目中间件中,在Lumen中,您应该像这样添加:

 $app->middleware([
    Vendor\Package\Middleware\TestMiddleware::class
 ]);

将中间件添加到包服务提供商

第二种方法,创建中间件并在自动加载器中加载它,如上例所示,然后创建服务提供者并在引导方法中注册中间件:

public function boot()
{
        $this->app->middleware([
               \Vendor\Package\Middleware\TestMiddleware::class
        ]);
}

最后,您应该在主项目中注册您的服务提供商(Lumen示例)

  $app->register(Vendor\Package\TestServiceProvider::class);

答案 4 :(得分:-1)

有两种注册软件包中间件的方法。

第一种方法是使用以下方法将中间件推入现有的中间件组:

$this->middlewareGroup($group_name, $middleware_list)

另一种方法是注册自定义中间件并将您的中间件分配给该组。

$this->pushMiddlewareToGroup(*string* $group_name, $middleware_list)

您可以在下面的链接中了解更多信息

中间件组:
https://laravel.com/api/5.5/Illuminate/Routing/Router.html#method_middlewareGroup

pushMiddlewareToGroup: https://laravel.com/api/5.5/Illuminate/Routing/Router.html#method_pushMiddlewareToGroup

答案 5 :(得分:-1)

流明的解决方案:

$this->app->middleware($middleware);