【问题标题】:Avoid creating a view for each AJAX function at CakePHP避免在 CakePHP 中为每个 AJAX 函数创建视图
【发布时间】:2012-11-28 00:05:21
【问题描述】:

我试图避免为我在控制器上使用的每个 AJAX 函数创建一个视图。 (因为我不以任何方式操作结果数据,并且在大多数情况下只是一个布尔值)

我在我的控制器上使用 RequestHandler 组件:

var $components = array('RequestHandler');

我在routes.php添加了这个

Router::parseExtensions('json');

我正在尝试使此功能正常工作,但我得到了 null 值:

public function test(){
    $this->layout = 'ajax';

    $result = '1';
    $this->set('_serialize', $result);
}

要访问函数的json 版本,我使用此URL 完成.json 以避免加载任何视图:

http://localhost/cakephp/demoController/test.json

我一直遵循 CakePHP 文档中的步骤: http://book.cakephp.org/2.0/en/views/json-and-xml-views.html#json-and-xml-views

我做错了什么?为什么我没有得到预期的结果,而是得到了null

另外,如果我尝试序列化一些数组,比如这个:

$result = array('demo' => '1');
$this->set('_serialize', $result);

我收到此通知:

注意 (8):未定义索引:1 [CORE\Cake\View\JsonView.php, line 89]代码上下文@ 987654332@                 foreach ($serialize as $key) {                     $data[$key] = $this->viewVars[$key];$view = null $布局=空 $序列化 = 数组( '演示' => '1' ) $数据 = 数组() $key = '1'JsonView::render() - CORE\Cake\View\JsonView.php,第 89 行 Controller::render() - CORE\Cake\Controller\Controller.php,第 957 行 Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php,第 193 行 Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php,第 161 行 要求 - APP\webroot\index.php,第 92 行 [主] - ROOT\index.php,第 42 行{“1”:null}

【问题讨论】:

    标签: cakephp cakephp-2.0 cakephp-2.2 cakephp-2.3


    【解决方案1】:

    你可以创建一个元素并渲染它。

    function test() {
        $this->autoRender = false;
    
        $result = array('demo' => '1');
    
        $this->set(compact('result'));
        $this->set('_serialize', array('result'));
        $this->render(DS.'Elements'.DS.'element_name');
    }
    

    See docs

    【讨论】:

    • 但是为每个函数创建一个元素几乎就像创建一个视图一样。它不能解决我任何问题。我正在寻找的是减少“愚蠢”视图的数量。
    • 好吧,如果结果总是一个布尔值(或总是 $result),那么您可以对所有操作使用相同的元素。
    • 但是,如果我仍然需要处理某种观点,那么使用serialize 方法的意义何在?这种方法不是应该避免使用视图吗?文档说:This lets you skip defining view files for your controller actions if you don’t need to do any custom formatting before your data is converted into json/xml.
    【解决方案2】:

    据我了解,您必须指定一个视图变量,然后在使用 _serialize 键时引用此变量。这意味着您的 sn-p 看起来像:

    $result = '1';
    $this->set('theResult', $result);
    $this->set('_serialize', array('theResult'));
    

    【讨论】:

      【解决方案3】:

      最简单的方法是这样。很适合我。

      public function fun() {
          $this->autoRender = false;
          $this->request->onlyAllow('ajax');
      
          $result = array('data1' => 'hello', 'data2' => 'world');
      
          return json_encode($result);
      }
      

      【讨论】:

      • 这是一个相当古老的问题,答案已被接受。如果你要发布一些东西,它真的应该包含一些解释性的话,也许是一些文档链接,一些东西。没有评论的随机代码简介不太可能对未来的读者或已经有 3 年答案的 OP 有用。
      • 以前的答案对我不起作用。我认为其他用户可能面临同样的问题。这就是我添加此代码的原因……这是最简单的方法。
      • 很好,但请解释一下。说清楚没有任何惩罚,事实上,恰恰相反。您添加的单词没有添加任何内容-解释自己,其他答案不起作用,为什么它们不起作用,为什么起作用。您是如何得出这个结论的,您使用的方法的一些文档,一些说明为什么其他答案可能不起作用的文档。这就是被否决的代码简介和由于更好而高于接受的代码的优秀迟到答案之间的区别。
      【解决方案4】:

      我的 URL 中没有 .json 扩展名,我的 routes.php 文件中没有 Router::parseExtensions('json'); 行,所以 @dhofstet's answer 对我不起作用。

      我的解决方案是添加renderAs() 调用:

      public $components = array('RequestHandler');
      
      public function my_ajax_action() {
          // do something
          $result = '1';
          $this->set('result', $result);
          $this->set('_serialize', array('result'));
          $this->RequestHandler->renderAs($this, 'json');
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多