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 类的 $routeMiddleware
array。
但我似乎找不到办法做到这一点。
我尝试创建一个扩展内核类的自定义类,然后我可以将数组与我的数组合并。 但是一旦退出构造函数就不可能了。
在 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 从包服务提供者注册中间件的主要内容,如果未能解决你的问题,请参考以下文章