我正在尝试使用从元素内部的控制器填充的内容,以便我可以使用内容来构建视图。
到目前为止,我有以下元素(.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
?
答案 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
[...]
看起来你只想获取和渲染模型数据,我建议你查看视图单元格。
答案 1 :(得分:0)
您应该拥有以下内容:
public function menu()
{
$categories = $this->Categories->find('all');
if($this->request->is('requested'):
$this->response->body($categories);
endif;
}