我的包含有一个自定义的中间件,我想将其添加到我的包的服务提供者中的Kernel类的
$routeMiddleware
数组中。但我似乎找不到这样做的方法。
我尝试创建一个扩展了Kernel类的自定义类,然后可以将数组与我的数组合并。
但一旦出了构造函数就不可能了。
在L4中你有App::middleware,但这个函数在L5中不再可用。
已经解决这个问题的任何人能帮助我解决这个问题吗?
如果我的问题不够清楚,请告诉我,以便我稍微澄清一下。
$routeMiddleware
数组中。我尝试创建一个扩展了Kernel类的自定义类,然后可以将数组与我的数组合并。
但一旦出了构造函数就不可能了。
在L4中你有App::middleware,但这个函数在L5中不再可用。
已经解决这个问题的任何人能帮助我解决这个问题吗?
如果我的问题不够清楚,请告诉我,以便我稍微澄清一下。
自 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 5.6 的内容。
/*In your package service provider*/
public function boot()
{
/** @var Router $router */
$router = $this->app['router'];
$router->pushMiddlewareToGroup('web', MyPackage\Middleware\WebOne::class);
}
在你的服务提供者中,你可以像这样访问路由器实例:
$this->app['router']
接下来,您可以像这样注册中间件:
$this->app['router']->middleware('middlewareName', 'your\namespace\MiddlewareClass');
将此代码放置在您的服务提供程序的注册方法中。
你可以用以下两种方式来实现:
首先,我们尝试第一种方法,通过在 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
]);
}
$app->register(Vendor\Package\TestServiceProvider::class);
app('router')->aliasMiddleware('yourmiddleware',yourclass::class)
Lumen的解决方案:
$this->app->middleware($middleware);
注册包中间件有两种方式。
第一种方式是使用以下方法将中间件推入现有的中间件组中:
$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
middlewareGroup
用于创建一个中间件组,而 pushMiddlewareToGroup
用于向现有的中间件组添加中间件。 - Martin
RouteServiceProvider
,然后它将接收一个$router
实例,该实例具有middleware
方法。我们可以使用此方法注册中间件,就像将它们放入Kernel
时发生的那样:http://prntscr.com/6yau6n - Anatoliy Arkhipovapp('router')->middleware('key', 'Value');
即可。 - Anatoliy Arkhipov