Laravel 4 Ajax检查包括XMLHttpRequest(来自Magnific Popup)

时间:2013-11-23 18:41:12

标签: php ajax laravel magnific-popup

使用the code from this question

@extends('layouts.' . isset($ajax) ? 'ajax' : 'master')

检查Ajax。它适用于常规Ajax页面加载,但不适用于使用弹出窗口。

在这种情况下,我使用Magnific Popup的Ajax模式,请求标头是XMLHttpRequest,但Laravel返回非ajax(扩展)布局。

1 个答案:

答案 0 :(得分:9)

首先,我不知道如何设置$ajax变量(isset($ajax)),但在Laravel中检查ajax请求的正确方法是

if(Request::ajax()) {
    // ...
}

或者,简短形式(在单个表达式中使用ternary运算符)

$ajax = Request::ajax() ? true : false;

所以,根据你的另一个答案的链接,这应该工作

@extends(((Request::ajax()) ? 'layouts.ajax' : 'layouts.master'))

这是如何运作的?

vendor\laravel\framework\src\Illuminate\Http中,您可以看到Request.php课程

/**
 * Determine if the request is the result of an AJAX call.
 * 
 * @return bool
 */
public function ajax()
{
    return $this->isXmlHttpRequest();
}

此处isXmlHttpRequest()是来自Request.php Symphony类的扩展方法,因为Laravel的{​​{1}}类扩展了Request并且在此class有一个主要方法,它通过

确定Symfony\Component\HttpFoundation\Request.php请求
ajax

因此,如果设置public function isXmlHttpRequest() { return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); } 请求标头,则它是ajax请求,如果未发送此标头,那么它不是X-Requested-With请求。所以,问题是ajax是如何设置的,如果它是由你设置的,那么你正在使用它的isset($ajax)库不是这样做的,而是发送jQuery请求标头而不是您应该使用X-Requested-With的{​​{1}}方法来确定Laravel请求。

顺便说一句,我更倾向于使用完全不同的Request::ajax() ajax请求,该请求不会扩展view布局。你可能会喜欢这个Detect Ajax Request-Php And Frameworks