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

Posted

技术标签:

【中文标题】Laravel 5 从包服务提供者注册中间件【英文标题】:Laravel 5 register middleware from in package service provider 【发布时间】:2015-06-18 10:11:26 【问题描述】:

我目前正在为 Laravel 5 开发一个包。 我的包包含一个自定义中间件,我想从我的包 Service Provider 中将它添加到 Kernel 类的 $routeMiddlewarearray。 但我似乎找不到办法做到这一点。

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

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

谁能帮我解决这个问题?

如果我的问题不够清楚,请告诉我,以便我澄清一下。

【问题讨论】:

有什么解决办法吗? 还没有,我还在寻找解决方案 我想我找到了。你的提供者应该扩展RouteServiceProvider,然后它将接收一个$router 的实例,它具有middleware 方法。我们可以使用这种方法注册中间件,就像将它们放入 Kernel 时一样:prntscr.com/6yau6n 结果比我想象的还要容易。您可以在服务提供商中调用app('router')->middleware('key', 'Value'); @Jeemusu 我为你创建了一个答案。 【参考方案1】:

从 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);

【讨论】:

不确定这正是要走的路。由于您必须先注册一个中间件并为其分配一个中间件数组 这仍然适用于 Laravel 8.x【参考方案2】:

关于 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);

【讨论】:

添加到新组会导致“目标类 [my_middleware] 不存在”,而“aliasMiddleware”工作正常【参考方案3】:

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

$this->app['router']

接下来你可以像这样注册中间件:

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

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

【讨论】:

此代码不再有效。以前有,现在不行了。【参考方案4】:

您可以通过以下两种方式做到这一点:

在您的通用中间件提供商中注册您的中间件 在你的包服务提供者中注册中间件

让我们尝试第一个 create 你的 TestMiddleware.php 文件在你的 src 包文件夹中,然后把它放在某个地方,在我的例子中,我把它放在 Middle-ware 文件夹中,然后将它添加到你的 composer.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
        ]);

最后你应该在你的主项目中注册你的服务提供者(流明示例)

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

【讨论】:

【参考方案5】:

流明的解决方案:

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

【讨论】:

【参考方案6】:

有两种方法可以注册你的包中间件。

第一种方法是将中间件推入现有的中间件组,方法如下:

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

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

$this->pushMiddlewareToGroup($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

【讨论】:

你似乎有相反的方式。 middlewareGroup 用于创建组,pushMiddlewareToGroup 用于推送到现有组。 @Martin 不是我在回答中提到的吗?请仔细阅读整个答案,而不仅仅是代码行 第一行代码中的方法是注册一组中间件,虽然上面写着pushing middleware into existing middleware group

以上是关于Laravel 5 从包服务提供者注册中间件的主要内容,如果未能解决你的问题,请参考以下文章

laravel服务容器

laravel扩展包服务提供者的注册的两种方式

Laravel编写自己的服务提供者

Laravel全局传递参数

laravel5.2,注册服务提供者时无法生效

springcloud系列 eureka注册中心集群搭建 服务消费方调用提供方