Laravel:我可以在返回响应之前覆盖laravel代码?

时间:2016-06-20 14:13:35

标签: php laravel

我希望在返回响应的地方覆盖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);
}

EDITED: 我有这个:

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

        $request = $next($request);

        //do after

        return $request;
    }
}

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

我的最终解决方案:

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

}