无法从元素访问控制器

时间:2015-01-29 01:35:02

标签: cakephp-3.0

我正在尝试使用从元素内部的控制器填充的内容,以便我可以使用内容来构建视图。

到目前为止,我有以下元素(.ctp文件)

<?php $categories = $this->requestAction('categories/menu'); ?>

<ul class="hidden">
    <?php foreach ($categories as $categorie): ?>
    <li><?= $this->Html->link($categorie->name, '#'); ?></li>
    <?php endforeach; ?>
</ul>

使用此控制器

class CategoriesController extends AppController
{
    public function index()
    {
        $categories = $this->Categories->find('all');
        $this->set(compact('categories'));
    }

    public function menu()
    {
        $categories = $this->paginate();
        $this->set('categories', $categories);
    }
}

当使用此处的代码时,我在日志中出现错误,并且页面Error: [Cake\View\Exception\MissingTemplateException] Template file "Categories\menu.ctp" is missing. 上没有显示任何内容。

如果我为此$this->set('categories', $categories);更改此ligne return $categories;,我的页面Error: Controller action can only return an instance of Response上会显示以下错误。

我最初尝试使用this tutorial中的代码(抱歉滚动只是转到缓存元素之前的最后一个示例),但它会导致第二条错误消息。

如何使用Controller中的Element

2 个答案:

答案 0 :(得分:9)

这是预期的行为,控制器需要呈现视图模板,除非您通过将Controller::$autoRender设置为false来明确禁用/绕过视图呈现,方法是返回{{1} }对象,或使用serialized data views

后者是错误消息告诉您该方法应该返回的内容,请参阅 http://book.cakephp.org/3.0/en/controllers.html#controller-actions

  

当您将控制器方法与Response一起使用时,您将典型地返回Routing\RequestActionTrait::requestAction()个实例。如果您具有用于普通Web请求+ requestAction的控制器方法,则应在返回

之前检查请求类型      
Response
     

[...]

查看单元格

看起来你只想获取和渲染模型数据,我建议你查看视图单元格。

<强> http://book.cakephp.org/3.0/en/views/cells.html

答案 1 :(得分:0)

您应该拥有以下内容:

public function menu()
{
    $categories = $this->Categories->find('all');
    if($this->request->is('requested'):
        $this->response->body($categories);
    endif;
}