Laravel 用于检测是否发送了Response::json的筛选器

Laravel 用于检测是否发送了Response::json的筛选器,laravel,filter,laravel-4,request,response,Laravel,Filter,Laravel 4,Request,Response,我有一个过滤器。我希望此过滤器仅在页面显示HTML时起作用,而不是在json或任何其他格式时起作用 App::after(function($request, $response) { if( $request->getMethod() == 'GET' && $request->getRequestFormat() == 'html' ) { // do something! } }); 在控制器函数中,我返回json数据: ret

我有一个过滤器。我希望此过滤器仅在页面显示HTML时起作用,而不是在json或任何其他格式时起作用

App::after(function($request, $response)
{
    if( $request->getMethod() == 'GET' && $request->getRequestFormat() == 'html' ) {
        // do something!
    }
});
在控制器函数中,我返回json数据:

return Response::json($data);
但是,
$request->getRequestFormat()
仍然等于“html”,不应该是

我知道我可以将格式设置为“json”,如下所示:

Request::setRequestFormat('json');
return Response::json($data);
success(response) {
    // Parse the json if not parsed by jQuery
    var obj = $.parseJSON(response);
    if(obj.success) {
        $('<div/>', {id:"query-log"}).append(obj.data).appendTo('body');
    }
}

但这似乎是多余的。如果我返回一个
响应::json
,它应该知道它是json而不是HTML。我如何检测它是
响应::json

这根本不是
json
,它是
HTML
,在
div
中包含一些
string
。删除div并使用以下命令传递
json

App::after(function($request, $response)
{
    if( $request->getMethod() == 'GET' && $request->getRequestFormat() == 'html' ) {

        // Test if response is JSON (PHP 5.3+ needed for this)
        json_decode($response);
        if ( json_last_error() != JSON_ERROR_NONE ) {
            // Do something
        }
    }
});
return Response::json($data);
然后在客户端,使用
jQuery
解析
json
数据,创建一个div并将数据附加到
div
中,例如,在
成功回调中尝试以下操作:

Request::setRequestFormat('json');
return Response::json($data);
success(response) {
    // Parse the json if not parsed by jQuery
    var obj = $.parseJSON(response);
    if(obj.success) {
        $('<div/>', {id:"query-log"}).append(obj.data).appendTo('body');
    }
}
此外,您还可以使用:

$.getJSON( "url", function( data ) {
    // ...
});
因此,将向服务器发送一个请求头,您可以使用以下命令检查请求是否需要
json
响应:

if($request->wantsJson()) {
    //
}
这是请求类中的方法:

/**
 * Determine if the current request is asking for JSON in return.
 *
 * @return bool
 */
public function wantsJson()
{
    $acceptable = $this->getAcceptableContentTypes();

    return isset($acceptable[0]) && $acceptable[0] == 'application/json';
}

这根本不是一个
json
,而是
HTML
,它在
div
中包含一些
string
。删除div并使用以下命令传递
json

return Response::json($data);
然后在客户端,使用
jQuery
解析
json
数据,创建一个div并将数据附加到
div
中,例如,在
成功回调中尝试以下操作:

Request::setRequestFormat('json');
return Response::json($data);
success(response) {
    // Parse the json if not parsed by jQuery
    var obj = $.parseJSON(response);
    if(obj.success) {
        $('<div/>', {id:"query-log"}).append(obj.data).appendTo('body');
    }
}
此外,您还可以使用:

$.getJSON( "url", function( data ) {
    // ...
});
因此,将向服务器发送一个请求头,您可以使用以下命令检查请求是否需要
json
响应:

if($request->wantsJson()) {
    //
}
这是请求类中的方法:

/**
 * Determine if the current request is asking for JSON in return.
 *
 * @return bool
 */
public function wantsJson()
{
    $acceptable = $this->getAcceptableContentTypes();

    return isset($acceptable[0]) && $acceptable[0] == 'application/json';
}

requestFormat不是自动设置的—您可以通过
setRequestFormat
以编程方式提供它,或者通过包含POST/GET参数
\u format
来提供它


如果要检查请求是否为JSON,可以执行
$request->isJson()
,但在我看来,您更像是在检查响应是否为JSON?在这种情况下,您可以执行以下操作:
$response instanceof illumb\Http\JsonResponse
$response->headers->get('Content-Type'))=='application/json'

请求格式不是自动设置的-您可以通过
setRequestFormat
以编程方式提供它,或者通过包含POST/GET参数
\u format
来提供它


如果要检查请求是否为JSON,可以执行
$request->isJson()
,但在我看来,您更像是在检查响应是否为JSON?在这种情况下,您可以执行照亮\Http\JsonResponse的
$response instanceof light\Http\JsonResponse
$response->headers->get('Content-Type')=='application/json'

您误解了我。完全忽略这些东西,那是不必要的。我更新了问题更新了答案。只需测试响应是否为有效的JSON。如果不是,假设它一定是HTML。你误解了我。完全忽略这些东西,那是不必要的。我更新了问题更新了答案。只需测试响应是否为有效的JSON。如果不是,假设它一定是HTML。对不起,我想我不清楚。你做的与我想做的相反。我不希望查询的#以JSON显示。当然,
是HTML而不是JSON。我想检测响应是否是Json,这样我就不能显示查询的内容完全忽略这些内容,这是不必要的。我更新了问题谢谢,
$request->wantsJSON()
,然后在jQuery中设置数据类型对我来说似乎是最干净的解决方案。对不起,我想我不清楚。你做的与我想做的相反。我不希望查询的#以JSON显示。当然,
是HTML而不是JSON。我想检测响应是否是Json,这样我就不能显示查询的内容完全忽略这些内容,这是不必要的。我更新了问题谢谢,
$request->wantsJSON()
,然后在jQuery中设置数据类型对我来说似乎是最干净的解决方案。