【问题标题】:How can I "override" middleware in Laravel/Lumen 5?如何在 Laravel/Lumen 5 中“覆盖”中间件?
【发布时间】:2016-10-14 09:02:08
【问题描述】:

我目前有一个使用 Lumen 作为后端的 Angular 应用程序。我使用包罗万象的方法是一个返回 Angular 主文件的全局中间件。我怎样才能最好地添加不通过此中间件的 API 路由?我是否必须不使用全局中间件而使用路由组?有没有办法可以在中间件内部测试它?这是我目前拥有的中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class ToAngular
{
    public function handle($request, Closure $next)
    {
        return view('master');
    }
}

【问题讨论】:

    标签: laravel routing lumen


    【解决方案1】:

    404 处理程序

    在这种情况下,我个人会避免使用中间件。如果你想要一个包罗万象的东西,你实际上是在定义一个自定义的 404 处理程序。所以我会这样处理。

    我会打开 app/Exceptions/Handler.php 并在 render 方法中添加一个条件。

    类似:

    public function render($request, Exception $e)
    {
        if($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        {
            return view('master');
        }
    
        return parent::render($request, $e);
    }
    

    现在您可以定义 API 路由,它们就可以正常工作,其他任何事情都属于这个 404。

    或者,您可以在resources/views/errors/404.blade.php 创建一个页面并让它扩展您的主视图,这将完成同样的事情,尽管我认为会包含一个 404 HTTP 标头。

    检查路段

    如果你真的想坚持使用中间件,你可以让它检查请求路由段。这样,如果这是一个合法的 API 请求,您就可以跳过全部视图。

    假设您的有效 API 端点都以 /api/ 开头,您可以这样做:

    public function handle($request, Closure $next)
    {
        if($request->segment(1) == "api") {
            // This is a valid api request! Let it proceed
            return $next($request);
        }
    
        // Otherwise return the master view
        return view('master');
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2019-10-16
      • 2015-07-29
      • 2015-07-08
      • 2023-03-30
      • 2016-10-09
      • 2018-11-10
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多