【问题标题】:Dynamic middleware for laravel 5laravel 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
  • 使用服务提供者和响应对象而不是“黑客”

【问题讨论】:

    标签: laravel laravel-5 multi-tenant laravel-routing


    【解决方案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-&gt;app['router']-&gt;aliasMiddleware('shortname', Vendor\Some\Class::class);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多