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

Gab*_*arp 2 php ajax laravel magnific-popup

使用这个问题的代码,

@extends('layouts.' . isset($ajax) ? 'ajax' : 'master')
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下我使用弹出Magnific酒店的Ajax模式中,请求头是XMLHttpRequest的但Laravel返回非Ajax(扩展)的布局.

The*_*pha 9

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

if(Request::ajax()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

$ajax = Request::ajax() ? true : false;
Run Code Online (Sandbox Code Playgroud)

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

@extends(((Request::ajax()) ? 'layouts.ajax' : 'layouts.master'))
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

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();
}
Run Code Online (Sandbox Code Playgroud)

这里isXmlHttpRequest()是从延伸方法 Request.php类的Symphony,因为LaravelRequest类扩展Symfony\Component\HttpFoundation\Request.php和在这个类有其确定的主要方法ajax通过请求

public function isXmlHttpRequest()
{
    return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
}
Run Code Online (Sandbox Code Playgroud)

因此,如果X-Requested-With设置了请求标头,则它是ajax请求,如果未发送此标头,那么它不是ajax请求.所以,问题是如何isset($ajax)设置,如果它是由你设置的,那么jQuery你正在使用它的库不会这样做,而是发送X-Requested-With请求头,在这种情况下你应该使用Laravel's Request::ajax()方法来确定ajax请求.

顺便说一句,我更喜欢使用完全不同viewajax请求,不扩展master布局.你可能会喜欢这个检测Ajax Request-Php和Frameworks.