拉拉维尔 4:响应来自控制器的 AJAX 请求
题
我正在尝试使用 Request::ajax() 方法从我的控制器生成特定于 ajax 的响应,该方法工作得很好。唯一的问题是我现在设置它的方式并不是一个很好看的解决方案。
我的控制器:
class HomeController extends BaseController {
protected $layout = 'layouts/main';
public function __construct()
{
$this->beforeFilter('auth');
}
public function getIndex()
{
$view = View::make('content.home.index');
if(Request::ajax()) return $view; //For ajax calls we only want to return the content to be placed inside our container, without the layout
$this->layout->menu = 'content.menu';
$this->layout->content = $view;
}
}
因此,现在,对于我在控制器中定义的每个方法,我需要添加代码片段来检查 AJAX 请求,并在语句返回 true 时返回单个视图。
这引出了我的问题,可能与 PHP 的关系比与框架的关系更大;
有没有一种方法可以对每个方法调用执行 AJAX 检查,而无需将其实际放置在方法内部?或者还有其他解决方案可以让我的代码保持干燥吗?
提前致谢!
附:这是我在 stackoverflow 上的第一篇文章,如果我有任何错误,请随时纠正我
解决方案
创建一个名为“layouts/ajax”(或任何您喜欢的名称)的新准系统布局。
<?php echo $content ?>
在您的基本控制器中,覆盖此 setupLayout()
功能。
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$layout = Request::ajax() ? 'layouts/ajax' : $this->layout;
$this->layout = View::make($layout);
}
}
改变你的 getIndex()
函数到此。
public function getIndex()
{
$view = View::make('content.home.index');
$this->layout->menu = 'content.menu';
$this->layout->content = $view;
}
现在非 ajax 请求将使用以下方式呈现 layout
在控制器中设置,ajax 请求将接收设置为的任何内容 $this->layout->content
.
笔记 :控制器将忽略布局设置 setupLayout()
, ,如果被调用的方法返回真值。所以这个方法不适用于下面的函数。
public function getIndex()
{
return View::make('content.home.index');
}
其他提示
如果它是Ajax请求,则可以在构造函数中更改布局属性:
public function __construct()
{
$this->beforeFilter('auth');
if(Request::ajax()) {
$this->layout = '';
}
}
.
如果它不起作用,请尝试将其设置为null。
为什么通过ajax返回视图?你用它来创造一个水疗吗?如果是这样,有更好的方式。我通常通过ajax返回HTML。
我在你的位置进入的路线可能与你的方式相反。无论如何渲染视图,如果请求是AJAX,请通过额外的数据,并在页面上呈现数据。这基本上是大多数JavaScript MVC框架函数。
抱歉,如果我完全错过了这里的那一点,就像你提供的信息一样,你的最终目标就会追求。不隶属于 StackOverflow