laravel 5 的动态中间件
Posted
技术标签:
【中文标题】laravel 5 的动态中间件【英文标题】:Dynamic middleware for laravel 5 【发布时间】:2015-07-21 19:38:19 【问题描述】:虽然building multi-tenancy packages for Laravel 5 我必须找出如何从代码中动态添加中间件。与this question on SO 相比,我不想触及 Http/Kernel 定义。
在应用程序初始化期间,我检查请求的主机名在数据库中是否已知,以及该主机名是否需要重定向到主主机名或 ssl。
因为你不想把Http/Kernel
作为一个包去碰,所以我们需要使用服务商。
要求:
动态添加中间件,不触碰Http/Kernel 使用服务提供者和响应对象而不是“黑客”【问题讨论】:
【参考方案1】:解决办法是在内核中动态注册中间件。首先编写你的中间件,例如:
<?php namespace HynMe\MultiTenant\Middleware;
use App;
use Closure;
use Illuminate\Contracts\Routing\Middleware;
class HostnameMiddleware implements Middleware
public function handle($request, Closure $next)
/* @var \HynMe\MultiTenant\Models\Hostname */
$hostname = App::make('HynMe\Tenant\Hostname');
if(!is_null($redirect = $hostname->redirectActionRequired()))
return $redirect;
return $next($request);
现在在您的service provider 中使用boot()
方法中的以下代码将此中间件添加到内核:
$this->app->make('Illuminate\Contracts\Http\Kernel')->prependMiddleware('HynMe\MultiTenant\Middleware\HostnameMiddleware');
回答redirectActionRequired()
方法在主机名对象中的作用:
/**
* Identifies whether a redirect is required for this hostname
* @return \Illuminate\Http\RedirectResponse|null
*/
public function redirectActionRequired()
// force to new hostname
if($this->redirect_to)
return $this->redirectToHostname->redirectActionRequired();
// @todo also add ssl check once ssl certificates are support
if($this->prefer_https && !Request::secure())
return redirect()->secure(Request::path());
// if default hostname is loaded and this is not the default hostname
if(Request::getHttpHost() != $this->hostname)
return redirect()->away("http://$this->hostname/" . (Request::path() == '/' ? null : Request::path()));
return null;
如果您需要动态注册 routeMiddleware,请在您的服务提供者中使用以下内容;
$this->app['router']->middleware('shortname', Vendor\Some\Class::class);
如果您对此实现有疑问,请添加 cmets。
【讨论】:
aliasMiddleware
是注册路由中间件的正确方法。 $this->app['router']->aliasMiddleware('shortname', Vendor\Some\Class::class);
以上是关于laravel 5 的动态中间件的主要内容,如果未能解决你的问题,请参考以下文章
监控系统实践第13天:5天上手Laravel8.5之中间件篇(2/5)