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

Tri*_*rey 2 ajax dry laravel laravel-4

我正在尝试通过使用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;
}

}
Run Code Online (Sandbox Code Playgroud)

所以现在,对于我在控制器中定义的每个方法,我需要添加检查AJAX请求的代码片段,如果语句返回true,则返回单个视图.

这导致我的问题可能与PHP相关,而不是框架;

有没有办法在每个方法调用上执行我的AJAX检查,而不是实际将它放在方法中?还是有其他解决方案来保持我的代码干?

提前致谢!

PS:这是我关于stackoverflow的第一篇文章,如果我犯了任何错误,请随时纠正我

tha*_*max 10

创建一个名为'layouts/ajax'(或您喜欢的任何名称)的新准系统布局.

    <?php echo $content ?>
Run Code Online (Sandbox Code Playgroud)

在Base控制器中,覆盖此setupLayout()功能.

protected function setupLayout()
{
    if ( ! is_null($this->layout))
    {
        $layout = Request::ajax() ? 'layouts/ajax' : $this->layout;
        $this->layout = View::make($layout);            
    }
}
Run Code Online (Sandbox Code Playgroud)

将您的getIndex()功能更改为此.

public function getIndex()
{
    $view = View::make('content.home.index');
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}
Run Code Online (Sandbox Code Playgroud)

现在非ajax请求将使用layout控制器中的set 进行渲染,其中ajax请求将接收任何设置$this->layout->content.

注意:setupLayout()如果被调用的方法返回truthy值,Controller将忽略布局设置.因此,此方法不适用于以下功能.

public function getIndex()
{
    return View::make('content.home.index');
}
Run Code Online (Sandbox Code Playgroud)