Laravel 4:响应来自控制器的AJAX请求

时间:2013-11-15 18:11:44

标签: ajax laravel laravel-4 dry

我正在尝试使用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上的第一篇文章,如果我犯了任何错误,请随时纠正我

3 个答案:

答案 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框架的功能。

很抱歉,如果我完全忽略了这一点,只是假设你的最终目标与你提供的信息。