Bonjour các bạn,
Nay mình gặp cái case này nên tiện thể share cũng như noted lại luôn tại blog =))
Như bài Event Handling đã chia sẻ: https://sethphat.com/sp-967/laravel-tim-hieu-va-di-sau-vao-event-handling
Nay sẽ là 1 phần nhỏ khi mình làm về Package Management của Laravel =))
1/ Problems – Listen to Event in Package Development
Mình đang làm 1 cái Package/Library cho Laravel, cụ thể là cái này: https://github.com/sethsandaru/laravel-multilingual
Mình sáng tạo như thế này, tạo Events và muốn Listen luôn tại cái Package của mình. Chứ để 1 mớ trong Controller thấy xấu wá =))
Oui/Ja/Yes/Vâng, vẫn có ServiceProvider, define luôn $listen và mapping Event – Listener vào thui.
Tuy nhiên test nó lại ko chạy 😨
Xem kỹ lại thì mình lại extend từ ServiceProvider cho nên giờ tạo thêm EventServiceProvider, extend lun EventServiceProvider và tại ServiceProvider chính register vào => vẫn ko chạy 😂
Trong đầu thì nghĩ chắc nó sẽ vẫn merge lại cái array $listen và final vào 1 cục rùi mapping thui. Nhưng thật ra không phải vậy.
Mọi Events sẽ phải dc mapping tại app\Providers\EventServiceProvider, và nó sẽ chạy duy nhất ở đó 🤔
=> Package Management sẽ ko mapping dc Event – Listener => Ko chạy 😎
Cụ thể ta cần đọc đoạn code này từ Laravel: https://github.com/laravel/framework/blob/5.5/src/Illuminate/Foundation/Support/Providers/EventServiceProvider.php#L31
2/ Solutions – Listen to Event in Package Development
Khi ta nhìn vào code (link ở trên), thì chỉ đơn giản nó vét cạn và register thông qua facade Event của Laravel thoy, là :
...
Event::listen($event, $listener);
...
Wow, vậy thì solution ở đây rồi. Chỉ cần thông qua facade Event này thoy 😍 Ngoài ra mình cũng đã define cái $listen y hệt EventServiceProvider nữa => Copy code từ Laravel lun cho lẹ 😜
Sửa chút cho nó ra vầy:
foreach ($this->listens() as $event => $listeners)
{
foreach ($listeners as $listener) {
Event::listen($event, $listener);
}
}
Xong => Package của mình đã có thể Listen vào Event của Package của mình hay những Event khác trong application.
Tương tự với những bạn mà sử dụng Event Subscriber , copy code luôn đoạn ở dưới là xong =))
3/ Final – Listen to Event in Package Development
Vâng, đôi khi ta mới thấy đọc code core của Laravel cũng có những cái rất hay và bổ ích.
Lần này cũng nhờ nó mà mình có thể đạt dc điều mình muốn để mình có thể tiếp tục develop cái package của mình 😁
Còn 1 cách nữa mà mình chưa test, là từ cái “EventServiceProvider” trong Package của mình, mình chưa thử define vào providers trong composer.json (sẽ test lại sau).
Cám ơn các bạn đã theo dõi, mong rằng đây sẽ là solution cho những bạn cũng sẽ và đang gặp problem này.