无法从元素访问控制器

Rém*_*émi 2 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>
Run Code Online (Sandbox Code Playgroud)

用这个控制器

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我如何使用ControllerElement

ndm*_*ndm 9

这是预期的行为,控制器需要呈现视图模板,除非通过设置Controller::$autoRenderfalse,通过使方法返回Response对象或使用序列化数据视图来显式禁用/绕过视图呈现.

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

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

// src/Controller/RecipesController.php

class RecipesController extends AppController
{
    public function popular()
    {
       $popular = $this->Recipes->find('popular');
        if (!$this->request->is('requested')) {
            $this->response->body(json_encode($popular));
            return $this->response;
        }
        $this->set('popular', $popular);
    }
}
Run Code Online (Sandbox Code Playgroud)

[...]

查看单元格

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

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