我目前正试图编写一个中间件从请求的路径和内容中过滤某些表达式。我知道可以分别使用$request->path()
和$request->getContent()
读取URI和原始正文内容,但无法找到更改它的方法。
我心目中的代码应该是这样的:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class MyMiddleware
{
public function handle(Request $request, Closure $next)
$uri = $request->path();
$body_content = $request->getContent();
$request->setContent(str_replace("foo","bar",$body_content));
$request->setPath(str_replace("foo","bar",$uri));
//functions setContent() and setPath() don't exist
return $next($request);
}
Laravel是否有我找不到的功能,或者如果没有,我该怎么做?
是的,您可以在中间件中修改传入请求。实际上,您的中间件可以扩展IlluminateFoundationHttpMiddlewareTransformsRequest
类,它已经有一堆有用的方法来帮助您这样做。您所要做的就是重写transform
方法。你可以在ConvertEmptyStringsToNull
中间件中看到它是如何完成的。
我现在通过创建一个带有修改过的内容的新请求来解决这个问题,如下所示:
public function handle(Request $request, Closure $next)
{
$uri = $request->path();
$body_content = $request->getContent();
//process $uri and $body_content here
$final_request = Request::create($uri, $request->method(), $request->query->all(), $request->cookies->all(), $request->allFiles(), $request->server->all(), $body_content);
return $next($final_request)
}