Php Laravel:在返回响应之前,我可以在哪里重写Laravel代码?
我希望在返回响应的地方覆盖laravel。然后我想检测状态代码(200或301)以及请求是否为ajax。若状态代码是200,请求是ajax,我想返回自定义html。差不多 : 编辑: 我有这个:Php Laravel:在返回响应之前,我可以在哪里重写Laravel代码?,php,laravel,Php,Laravel,我希望在返回响应的地方覆盖laravel。然后我想检测状态代码(200或301)以及请求是否为ajax。若状态代码是200,请求是ajax,我想返回自定义html。差不多 : 编辑: 我有这个: class SomeMiddleware { public function handle($request, Closure $next) { // do before $request = $next($request); //d
class SomeMiddleware
{
public function handle($request, Closure $next)
{
// do before
$request = $next($request);
//do after
return $request;
}
}
但是如何检测当前响应是否重定向?如果您想检查最终响应并可能返回另一个响应,让我们编写一个简单的中间件 听起来您希望在构建默认响应之后,在最后进行检查(这样您就可以检查它)。因此,我们将这样开始:
// First get the default response
$response = $next($request);
我们的$response
变量现在将保存Laravel即将响应的响应
如果要查看响应是否为重定向,可以轻松检查RedirectResponse
实例:
$isRedirect = $response instanceof \Illuminate\Http\RedirectResponse;
您可以简单地测试原始请求是否是ajax:
$isAjax = $request->ajax();
如果您现在想返回不同的响应,而不是您收到的响应,我将使用简单的response()
helper方法:
return response($content, $status);
综上所述,我相信这大概就是你想要的:
use Illuminate\Http\RedirectResponse;
class HijackMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
if($request->ajax() && $response instanceof RedirectResponse) {
return response("This is a <strong>different and custom</bold> response");
}
return $response;
}
}
使用照亮\Http\RedirectResponse;
类劫持中间件
{
公共函数句柄($request,Closure$next)
{
$response=$next($request);
如果($request->ajax()&&$response instanceof RedirectResponse){
返回响应(“这是一个不同的自定义响应”);
}
返回$response;
}
}
我的最终解决方案:
<?php
namespace App\Http\Middleware;
use Closure;
use Response;
use Request;
class AjaxForm
{
public function handle($request, Closure $next, $guard = null)
{
$response = $next($request);
if(Request::ajax() && $response->status() == 301) {
return (Response::make($response->getTargetUrl(), '200'));
}
return $response;
}
}
您还有什么吗?在您的问题中,您说过如果请求是ajax,您希望返回一个自定义响应。为什么您现在需要知道响应是否是重定向?因为如果响应是重定向(301)和ajax,这很复杂,而且浏览器相关的“关闭”重定向会在jquery中出现,所以当请求是ajax和301时,我想将301更改为200,然后手动重定向。好的,请参阅下面的答案,我已经浏览了我认为您正在寻找的内容。好的,这很好,现在我需要重定向url,就这样。@fico7489$response->getTargetUrl()
@fico7489我刚刚拒绝了编辑。您已经将$request
交给了您的函数,请使用它!比调用\Request
门面要好得多。@fico7489如果您更喜欢$response->getStatusCode()==301
,那就好了。我更喜欢寻找一个实例RedirectResponse
,我认为它更清楚代码在寻找什么。您的调用。@fico7489请确保在文件顶部有use
语句来导入该类。另外,只需dd($response)
检查它,看看它是什么!
<?php
namespace App\Http\Middleware;
use Closure;
use Response;
use Request;
class AjaxForm
{
public function handle($request, Closure $next, $guard = null)
{
$response = $next($request);
if(Request::ajax() && $response->status() == 301) {
return (Response::make($response->getTargetUrl(), '200'));
}
return $response;
}
}