是否可以從監聽器中設置變量。這是我想做到:CakePHP 3:在監聽器中設置變量
我創建了一個博客插件,因爲首頁會很複雜,我想一個事件附加到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? 有沒有更好的方法?
我認爲一個單元格可能更適合這種情況https://book.cakephp.org/3.0/en/views/cells.html – burzum
@burzum我試圖避免使用單元格來使其更加簡化。從我從單元格理解的內容中,我將不得不爲各個部分創建方法,即。 latestItems(),headlineItems()等等。基於我創建的是獨立插件的事實,我想我只是將該變量傳遞給應用程序的模板,並讓他們與團隊打交道。另外,從數據庫中獲取不重複的項目可能會很複雜。 –
我希望EventListener會是這種情況下更好的解決方案。 –