Làm thứ làm cho Laravel Request của bạn thú vị hơn

Laravel – Listen to Event in Package Development

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.

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook