CakePHP 3:在监听器中设置变量

时间:2017-03-26 17:46:00

标签: cakephp

是否可以在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吗? 还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

$event->subject()是您的控制器实例,因此只需使用$event->subject()->set()