迁移到Laravel,虚荣URL,所有请求的中间件,Auth :: user和$ errors问题

时间:2016-12-23 21:34:34

标签: laravel-5 laravel-5.3 laravel-routing laravel-middleware laravel-request

我创建了一个名为PathParser的中间件类,它在每个请求上运行。目的是处理我们允许用户在我们的Laravel之前的vanilla PHP应用程序中创建的“虚荣URL路径”请求。例如:用户创建了一个URL路径,例如:http://example.com/i-love-this-place

PathParser做的是检查404响应,然后查看URL路径是否与我们旧的虚荣路径相匹配。像这样:

class PathParser
{   
    public function handle($request, Closure $next, $guard = null)
    {
        $next_response = $next($request);       
        $status_code = $next_response->getStatusCode();

        if ($status_code === 404) {
            $script_url = $request->server("SCRIPT_URL");

            $vanity_controller = new VanityController();
            $found_vanity_id = Search::findVanityPath($script_url);

            if (!empty($found_vanity_id)) {
                $next_response = response()->make($vanity_controller->one($found_vanity_id));
            }
        }

        return $next_response;
    }
}

假设如下:

  1. 用户从未创建过与任何路径冲突的网址路径

  2. 必须支持许多现存的(Laravel之前)虚荣URL路径,这些路径在野外 - 发布到社交媒体等等。

  3. 在Kernel.php中,我有以下内容:

    protected $middleware = [
            \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
            \App\Http\Middleware\PathParser::class,
            //\Illuminate\Session\Middleware\StartSession::class,
            //\Illuminate\View\Middleware\ShareErrorsFromSession::class,
        ];
    
        protected $middlewareGroups = [
            'web' => [
                \App\Http\Middleware\EncryptCookies::class,
                \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
                \Illuminate\Session\Middleware\StartSession::class,
                \Illuminate\View\Middleware\ShareErrorsFromSession::class,
                \App\Http\Middleware\VerifyCsrfToken::class,
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],    
        ];
    

    在$ middleware数组中,我尝试添加StartSession和ShareErrorsFromSession(取消注释上面的2行),这部分工作。 有两个主要问题:

    • Auth :: user为空,即使是登录用户对虚荣路径发出的请求
    • 当用户提交错误/无效信息时,
    • $错误不再填写表单提交(例如在注册和登录页面上)

    有没有办法检查所有请求的路由并获得经过身份验证的用户,还保留$ errors?

    我有一种感觉,我不理解请求生命周期,以便取得成功。但也许有办法?

    如果无法按照我的要求进行操作,那么使用302重定向到标准化的前缀路径(例如http://example.com/ 虚荣 / i-love-this-place)是一个精细解决方案但我希望还有其他办法。

1 个答案:

答案 0 :(得分:1)

一些建议:

如果您不需要auth / sessions / etc,那么您可以在应用程序的异常处理程序中处理reloadtime异常。

Symfony\Component\HttpKernel\Exception\NotFoundHttpException中,修改app/Exceptions/Handler.php方法,使其类似于:

render()

如果你确实需要auth / sessions / etc,我建议你在路径文件的末尾创建一个“catchall”路由。例如,作为public function render($request, Exception $e) { if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) { // your code that returns a Response } return parent::render($request, Exception $e); } 文件中的最后一行,请输入:

routes/web.php

然后,在Route::any('{catchall}', 'VanityController@handle')->where('catchall', '(.*)'); 内,使用VanityController方法,如下所示:

handle