我正在尝试使用 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框架函数。

抱歉,如果我完全错过了这里的那一点,就像你提供的信息一样,你的最终目标就会追求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top