【问题标题】:Laravel 4: Responding to AJAX requests from controllerLaravel 4:响应来自控制器的 AJAX 请求
【发布时间】:2013-11-29 05:49:33
【问题描述】:

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

}

所以现在,对于我在控制器中定义的每个方法,我都需要添加代码 sn-p 来检查 AJAX 请求并在语句返回 true 时返回单个视图。

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

有没有一种方法可以对每个方法调用执行 AJAX 检查,而无需实际将其放入方法中?还是有其他解决方案可以让我的代码保持干燥?

提前致谢!

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

【问题讨论】:

  • 我会为该 AJAX 调用创建一个单独的 URI,而不是动态地决定发送 HTML 的一部分还是 HTML 的整个页面。它更接近于 HTTP 的使用方式。您也可以考虑返回 JSON 并使用一些客户端模板,例如 MustacheJS

标签: ajax laravel laravel-4 dry


【解决方案1】:

为什么要通过 ajax 返回 VIEW?您是否使用它来创建 SPA?如果是这样,有更好的方法。我一般反对通过 AJAX 返回 HTML。

我在你的位置上走的路线可能与你的做法相反。无论如何渲染视图,如果请求是ajax,则将额外的数据传回并让JS在页面上渲染数据。这基本上就是大多数 Javascript MVC 框架的功能。

很抱歉,如果我完全错过了这里的重点,只是根据您提供的信息假设您的最终目标。

【讨论】:

  • 可能返回的是 HTML 而不是 JSON,并且想要返回其中的一部分而不是整个站点(布局 + 部分)
【解决方案2】:

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

    <?php echo $content ?>

在您的 Base 控制器中,覆盖此 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-&gt;layout-&gt;content 的任何内容。

注意:如果调用的方法返回真值,控制器将忽略setupLayout() 中的布局设置。所以这个方法不适用于下面的函数。

public function getIndex()
{
    return View::make('content.home.index');
}

【讨论】:

  • 谢谢,这回答了我的问题,看起来是一个非常简洁的解决方案 :) 如果它不需要 15 声望,我会支持你的答案:p
  • 我认为您可以通过单击复选标记来接受它作为答案。这样它可能会在未来帮助其他人。
  • 啊,没注意到!检查它:)
【解决方案3】:

如果是 ajax 请求,您可以在构造函数中更改布局属性:

public function __construct()
{
    $this->beforeFilter('auth');

    if(Request::ajax()) {
        $this->layout = '';
    }
}

如果它不起作用,请尝试将其设置为 NULL。

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2016-09-10
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多