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

20
我目前正在为Laravel 5开发/创建一个包。
我的包含有一个自定义的中间件,我想将其添加到我的包的服务提供者中的Kernel类的$routeMiddleware数组中。
但我似乎找不到这样做的方法。

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

在L4中你有App::middleware,但这个函数在L5中不再可用。

已经解决这个问题的任何人能帮助我解决这个问题吗?

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


还没有,我还在寻找解决方案。 - Joren Van Hocht
我想我找到了。您的提供程序应该扩展RouteServiceProvider,然后它将接收一个$router实例,该实例具有middleware方法。我们可以使用此方法注册中间件,就像将它们放入Kernel时发生的那样:http://prntscr.com/6yau6n - Anatoliy Arkhipov
2
结果比我想象的还要简单。您只需在服务提供程序中调用 app('router')->middleware('key', 'Value'); 即可。 - Anatoliy Arkhipov
@AnatoliyArkhipov 你写一个完整的答案怎么样? - Jeemusu
1
@Jeemusu,我为你创建了一个答案。 - Joren Van Hocht
显示剩余2条评论
7个回答

31

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

不确定这是否是正确的方法。因为您必须先注册中间件,然后将中间件数组分配给它。 - Agil
截至Laravel 8.x版本,这仍然有效。 - SameOldNick

17

这是关于 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”则可以正常工作。 - ymakux

13

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

$this->app['router']

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

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

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


这段代码不再起作用了。它曾经可以,但现在不行了。 - Theodore R. Smith

0

你可以用以下两种方式来实现:

  • 在通用中间件提供程序中注册你的中间件
  • 在包的服务提供程序中注册中间件

首先,我们尝试第一种方法,通过在 src 包文件夹中创建 TestMiddleware.php 文件,并将其放置在某个位置,例如我将其放置在 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
        ]);
}

最后,你应该在你的主项目中注册你的服务提供者(以Lumen为例)。
  $app->register(Vendor\Package\TestServiceProvider::class);

0
在 Laravel 9 中,在 package service provider 和 register 函数中,可以使用 app('router')->aliasMiddleware 方法,例如:
app('router')->aliasMiddleware('yourmiddleware',yourclass::class)

-1

Lumen的解决方案:

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

-3

注册包中间件有两种方式。

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

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

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

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

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

middlewareGroup:
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

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


2
你好像搞反了。middlewareGroup 用于创建一个中间件组,而 pushMiddlewareToGroup 用于向现有的中间件组添加中间件。 - Martin
@Martin,这不是我在回答中已经提到的吗?请仔细阅读整个答案,而不仅仅是代码行。 - Agil
你代码的第一行方法是用来注册一组中间件的,虽然在它上面写着“将中间件推入现有的中间件组”。 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接