我如何在 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');
}
我目前有一个 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');
}