Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:在返回响应之前,我可以在哪里重写Laravel代码?_Php_Laravel - Fatal编程技术网

Php Laravel:在返回响应之前,我可以在哪里重写Laravel代码?

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

我希望在返回响应的地方覆盖laravel。然后我想检测状态代码(200或301)以及请求是否为ajax。若状态代码是200,请求是ajax,我想返回自定义html。差不多 :

编辑: 我有这个:

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;
    }

}