2017-03-26 39 views
0

是否可以從監聽器中設置變量。這是我想做到: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? 有沒有更好的方法?

+0

我認爲一個單元格可能更適合這種情況https://book.cakephp.org/3.0/en/views/cells.html – burzum

+0

@burzum我試圖避免使用單元格來使其更加簡化。從我從單元格理解的內容中,我將不得不爲各個部分創建方法,即。 latestItems(),headlineItems()等等。基於我創建的是獨立插件的事實,我想我只是將該變量傳遞給應用程序的模板,並讓他們與團隊打交道。另外,從數據庫中獲取不重複的項目可能會很複雜。 –

+0

我希望EventListener會是這種情況下更好的解決方案。 –

回答

2

$event->subject()是您的控制器實例,所以只需使用$event->subject()->set()即可。

+0

離開這裏!這是一個很棒的解決方案,完全符合我的需求。非常感謝! –