2

使用这个问题的代码

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

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

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

4

1 回答 1

10

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

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

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

$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,因为LaravelRequest类扩展了Symfony\Component\HttpFoundation\Request.php,并且在这个类中有一个主要方法,它ajax通过以下方式确定请求

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

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

顺便说一句,我更愿意对不扩展布局的请求使用完全不同view的请求。你可能会喜欢这个Detect Ajax Request-Php And Frameworksajaxmaster

于 2013-11-23T20:39:37.533 回答