我正在尝试使用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检查,而不是实际将它放在方法中?或者是否有其他解决方案来保持我的代码DRY?
提前致谢!
PS:这是我在stackoverflow上的第一篇文章,如果我犯了任何错误,请随时纠正我
答案 0 :(得分:10)
创建一个名为'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
的任何内容。
注意:如果被调用的方法返回truthy值,Controller将忽略setupLayout()
中的布局设置。因此,此方法不适用于以下功能。
public function getIndex()
{
return View::make('content.home.index');
}
答案 1 :(得分:1)
如果是ajax请求,你可以在构造函数中更改layout属性:
public function __construct()
{
$this->beforeFilter('auth');
if(Request::ajax()) {
$this->layout = '';
}
}
如果不起作用,请尝试将其设置为NULL。
答案 2 :(得分:0)
为什么要通过ajax返回VIEW?你用它来创建一个SPA吗?如果是这样,有更好的方法。我一般反对通过AJAX返回HTML。
我走向你的路线可能与你的做法相反。无论如何呈现视图,如果请求是ajax,则返回额外数据并让JS在页面上呈现数据。这基本上是大多数Javascript MVC框架的功能。
很抱歉,如果我完全忽略了这一点,只是假设你的最终目标与你提供的信息。