是否可以在Listener中设置变量。这就是我想要完成的事情:
我创建了一个Blog插件,因为主页很复杂,我想为页面控制器附加一个事件到 beforeRender ,然后返回一个包含200个项目的列表可以消费'在不同的视图和元素中(即/src/Template/Pages/display.ctp
和/src/Template/Element/latest_blog_items.ctp
)
到目前为止,我已经创建了这个
// Blog.config/bootstrap.php
<?php
$homepageListener = new HomepageListener();
EventManager::instance()->attach($homepageListener);
在同一个插件中
// Blog.src/Event/HomepageListener.php
<?php
namespace Blog\Event;
use Cake\Event\Event;
use Cake\Event\EventListenerInterface;
use Cake\Core\Configure;
use Cake\ORM\TableRegistry;
class HomepageListener implements EventListenerInterface {
public function implementedEvents() {
return [
'Controller.beforeRender' => 'getBlogItems',
];
}
public function getBlogItems(Event $event) {
if ($event->subject()->name == 'Pages') {
$fBlogItems = TableRegistry::get('Blog.BlogPosts')->find('all')->order(['BlogPosts.created' => 'desc'])->limit(200)->toArray();
// This works, but I didn't want to do it this way
Configure::write('fBlogItems', $fBlogItems);
// My desired solution would be creating a variable similar to what is done in Controllers
// ie. $this->set('fBlogItems', $fBlogItems);
}
}
}
我还没弄清楚如果可能的话,我可以设置一个变量(即。$this->set('fBlogItems, $fBlogItems)
并确保它在我的模板文件中可用。
这是可能的还是可取的? 它会破坏MVC吗? 还有更好的方法吗?
答案 0 :(得分:2)
$event->subject()
是您的控制器实例,因此只需使用$event->subject()->set()
。