使用the code from this question,
@extends('layouts.' . isset($ajax) ? 'ajax' : 'master')
检查Ajax。它适用于常规Ajax页面加载,但不适用于使用弹出窗口。
在这种情况下,我使用Magnific Popup的Ajax模式,请求标头是XMLHttpRequest,但Laravel返回非ajax(扩展)布局。
答案 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。