【问题标题】:Laravel: where I can override laravel code before response is returned?Laravel:在返回响应之前我可以在哪里覆盖 laravel 代码?
【发布时间】:2016-10-21 20:13:47
【问题描述】:

我想在返回响应的地方覆盖 laravel。然后我想检测状态码(200 或 301)以及请求是否为 ajax。如果状态码是 200 并且请求是 ajax 我想返回自定义 html。就像是 :

protected function returnResponse($statusCode, $html, $redirectUrl){
    if($statusCode == 200  &&  isAjax()){
        return parent::returnResponse($customStatusCode, $customHtml, $customRedirectUrl);
    }
    return parent::returnResponse($statusCode, $html, $redirectUrl);
}

编辑: 我有这个:

class SomeMiddleware
{
    public function handle($request, Closure $next)
    {
        // do before 

        $request = $next($request);

        //do after

        return $request;
    }
}

但是如何检测当前响应是否重定向?

【问题讨论】:

  • 你还有什么吗?
  • 在您的问题中,您说如果请求是 ajax,您希望返回自定义响应。为什么现在需要知道响应是否重定向?
  • 因为如果响应是重定向(301)和ajax,它很复杂并且浏览器相关的“关闭”重定向跟随在jquery中,所以当请求是ajax和301时我想将301更改为200然后手动重定向。
  • 好的,请看下面的答案,我已经浏览了我认为您正在寻找的部分。

标签: php laravel


【解决方案1】:

如果您想检查最终响应并可能返回替代响应,让我们编写一个简单的中间件。

听起来您想在最后进行检查,默认响应已构建(因此您可以检查它)。所以我们会这样开始:

// First get the default response
$response = $next($request);

我们的 $response 变量现在将保存 Laravel 即将响应的响应。

如果您想查看响应是否为重定向,您可以轻松检查RedirectResponse 实例:

$isRedirect = $response instanceof \Illuminate\Http\RedirectResponse;

您可以很简单地测试一下原始请求是否是ajax:

$isAjax = $request->ajax();

如果您现在想返回一个不同的响应而不是您收到的响应,我会使用简单的 response() 辅助方法:

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

【讨论】:

  • 好的,这很好,现在我需要获取重定向的 url,仅此而已。
  • @fico7489 $response-&gt;getTargetUrl()
  • @fico7489 我刚刚拒绝了编辑。您已经将$request 交给您的函数,使用它!比调用\Request 门面要好得多。
  • @fico7489 如果你更喜欢$response-&gt;getStatusCode() == 301,那很好。我更喜欢寻找一个实例RedirectResponse,我认为代码在寻找什么更清楚。您的来电。
  • @fico7489 确保文件顶部有 use 语句以导入该类。另外,只需dd($response) 来检查它,看看它是什么!
【解决方案2】:

我的最终解决方案:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2015-04-28
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多