我如何在 Laravel/Lumen 5 中 "override" 中间件?

How can I "override" middleware in Laravel/Lumen 5?

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

<?php

namespace App\Http\Middleware;

use Closure;

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

404 处理程序

在这种情况下,我个人会避免使用中间件。如果您想要 catch-all,您实际上是在定义自定义 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 header。

检查路线段

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

假设您的有效 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');
}