Laravel’de Özel Etkinlikler

Bu yazıda, Laravel’de olay yönetiminin temellerini keşfedeceğiz. Ayrıca özel bir olay ve dinleyicinin gerçek dünyadan bir örneğini oluşturacağız.
Laravel’deki olay kavramı, çok popüler bir yazılım tasarım modeline, yani gözlemci modeline dayanmaktadır. Bu modelde, bir şey olduğunda sistem olayları yükseltir ve bu olayları dinleyen ve buna göre tepki veren dinleyiciler tanımlayabilirsiniz. Bir sistemdeki bileşenleri ayırmanıza izin veren, aksi takdirde sıkı bir şekilde bağlanmış kodla sonuçlanacak gerçekten kullanışlı bir özelliktir.
Örneğin, birisi sitenize giriş yaptığında bir sistemdeki tüm modülleri bilgilendirmek istediğinizi varsayalım. Böylece, ister bir e-posta veya uygulama içi bildirim göndermekle ilgili olsun, isterse bu oturum açma olayına tepki vermek isteyen herhangi bir şey olsun, bu oturum açma olayına tepki vermelerini sağlar.
Olayların ve Dinleyicilerin Temelleri
Bu bölümde, Laravel’in olayları ve dinleyicileri çekirdek çerçevede uygulama yöntemini keşfedeceğiz. Laravel mimarisine aşinaysanız, muhtemelen Laravel’in bir uygulamaya farklı hizmetler enjekte etmenize izin veren bir hizmet sağlayıcı kavramını uyguladığını biliyorsunuzdur.
Benzer şekilde, Laravel yerleşik bir EventServiceProvider.php bir uygulama için olay dinleyici eşlemelerini tanımlamamıza izin veren sınıf.
Devam et ve içeri çek app/Sağlayıcılar/EventServiceProvider.php dosya.
<?php namespace AppProviders; use IlluminateAuthEventsRegistered; use IlluminateAuthListenersSendEmailVerificationNotification; use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider; use IlluminateSupportFacadesEvent; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Yakından bir göz atalım $listen
bir dizi olayı ve ilişkili dinleyicileri tanımlamanıza izin veren özellik. Dizi anahtarları, bir sistemdeki olaylara karşılık gelir ve değerleri, ilgili olay bir sistemde ortaya çıktığında tetiklenecek olan dinleyicilere karşılık gelir.
Daha fazla göstermek için gerçek dünyadan bir örnek üzerinden gitmeyi tercih ediyorum. Muhtemelen bildiğiniz gibi, Laravel, oturum açma, kayıt olma ve benzeri özellikleri kolaylaştıran yerleşik bir kimlik doğrulama sistemi sağlar.
Birisi uygulamada oturum açtığında, güvenlik önlemi olarak bir e-posta bildirimi göndermek istediğinizi varsayalım. Laravel olay dinleyici özelliğini desteklemiyorsa, çekirdek sınıfı düzenlemeyi veya e-posta gönderen kodunuzu eklemek için başka bir yöntemi kullanmayı bitirmiş olabilirsiniz.
Aslında, Laravel olay dinleyicisini kullanarak bu sorunu çözmenize yardımcı olduğu için daha şanslı taraftasınız. revize edelim app/Sağlayıcılar/EventServiceProvider.php dosya aşağıdaki gibi görünecek.
<?php namespace AppProviders; use IlluminateAuthEventsRegistered; use IlluminateAuthListenersSendEmailVerificationNotification; use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider; use IlluminateSupportFacadesEvent; use AppListenersSendEmailNotification; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], IlluminateAuthEventsLogin::class => [ SendEmailNotification::class, ] ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
IlluminateAuthEventsLogin
tarafından gündeme getirilecek bir olaydır. Auth
Birisi bir uygulamada oturum açtığında eklenti. Biz o olayı bağladık AppListenersSendEmailNotification
dinleyici, bu yüzden tetiklenecek login
Etkinlik.
Tabii ki, tanımlamanız gerekir AppListenersSendEmailNotification
ilk etapta dinleyici sınıfı. Her zaman olduğu gibi, Laravel, aşağıdakileri kullanarak bir dinleyicinin şablon kodunu oluşturmanıza izin verir. artisan
emretmek.
php artisan event:generate
Bu komut, altında listelenen olay ve dinleyici sınıflarını oluşturur. $listen
Emlak.
Bizim durumumuzda, IlluminateAuthEventsLogin
olay zaten var, bu yüzden yalnızca AppListenersSendEmailNotification
dinleyici sınıfı Aslında, yaratmış olurdu IlluminateAuthEventsLogin
olay sınıfı da ilk etapta olmasaydı.
Şimdi oluşturulan listener sınıfına bir göz atalım. app/Dinleyiciler/SendEmailNotification.php.
<?php namespace AppListeners; use AppProvidersIlluminateAuthEventsLogin; use IlluminateContractsQueueShouldQueue; use IlluminateQueueInteractsWithQueue; class SendEmailNotification { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param Login $event * @return void */ public function handle(Login $event) { // } }
Bu handle
dinleyici tetiklendiğinde uygun bağımlılıklarla çağrılacak yöntem. Bizim durumumuzda, $event
argüman, oturum açma olayıyla ilgili bağlamsal bilgileri, oturum açmış kullanıcı bilgilerini içermelidir.
Ve kullanabiliriz $event
içinde daha fazla işlem yapmak için nesne handle
yöntem. Bizim durumumuzda, oturum açmış kullanıcıya bir e-posta bildirimi göndermek istiyoruz.
Düzenlenen handle
yöntem şöyle görünebilir:
public function handle(Login $event) { // get logged in user's email and username $email = $event->user->email; $username = $event->user->name; // send email notification about login }
Yani Laravel’deki olaylar özelliğini böyle kullanmanız gerekiyor. Sonraki bölümde, özel bir olay ve ilişkili bir dinleyici sınıfı oluşturacağız.
Özel Etkinlik Oluştur
Örneğimiz için kullanacağımız örnek senaryo şuna benzer:
- Bir uygulamanın belirli noktalarda sistemdeki önbellekleri temizlemesi gerekir. yükselteceğiz
CacheClear
Olay, bir uygulama yukarıda belirtilenleri yaptığında bağlamsal bilgilerle birlikte. Temizlenen bir olayla birlikte önbellek grubu anahtarlarını ileteceğiz. - Bir sistemdeki diğer modüller şunları dinleyebilir:
CacheClear
olay ve ilgili önbellekleri ısıtan kodu uygulamak istiyor.
tekrar gözden geçirelim app/Sağlayıcılar/EventServiceProvider.php özel olay ve dinleyici eşlemelerimizi dosyalayın ve kaydedin.
<?php namespace AppProviders; use IlluminateAuthEventsRegistered; use IlluminateAuthListenersSendEmailVerificationNotification; use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider; use IlluminateSupportFacadesEvent; use AppListenersWarmUpCache; use AppEventsClearCache; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], ClearCache::class => [ WarmUpCache::class, ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Gördüğünüz gibi, tanımladık AppEventsClearCache
olay ve ilişkili dinleyici sınıfı AppListenersWarmUpCache
altında $listen
Emlak.
Ardından, ilişkili sınıf dosyaları oluşturmamız gerekiyor. her zaman kullanabileceğinizi hatırlayın. artisan
bir temel şablon kodu oluşturma komutu.
php artisan event:generate
Bu, olay sınıfını şu adreste yaratmalıydı: app/Events/ClearCache.php ve dinleyici sınıfı app/Dinleyiciler/WarmUpCache.php.
Birkaç değişiklikle, app/Events/ClearCache.php sınıf şöyle görünmelidir:
<?php namespace AppEvents; use IlluminateBroadcastingChannel; use IlluminateBroadcastingInteractsWithSockets; use IlluminateBroadcastingPresenceChannel; use IlluminateBroadcastingPrivateChannel; use IlluminateContractsBroadcastingShouldBroadcast; use IlluminateFoundationEventsDispatchable; use IlluminateQueueSerializesModels; class ClearCache { use Dispatchable, InteractsWithSockets, SerializesModels; public $cache_keys = []; /** * Create a new event instance. * * @return void */ public function __construct(Array $cache_keys) { $this->cache_keys = $cache_keys; } /** * Get the channels the event should broadcast on. * * @return IlluminateBroadcastingChannel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } }
Muhtemelen fark ettiğiniz gibi, yeni bir mülk ekledik $cache_keys
bir olayla birlikte iletilecek bilgileri tutmak için kullanılacaktır. Bizim durumumuzda, temizlenmiş önbellek gruplarını geçeceğiz.
Ardından, dinleyici sınıfına güncellenmiş bir göz atalım. handle
yöntem app/Dinleyiciler/WarmUpCache.php.
<?php namespace AppListeners; use AppEventsClearCache; use IlluminateContractsQueueShouldQueue; use IlluminateQueueInteractsWithQueue; class WarmUpCache { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param ClearCache $event * @return void */ public function handle(ClearCache $event) { if (isset($event->cache_keys) && count($event->cache_keys)) { foreach ($event->cache_keys as $cache_key) { // generate cache for this key // warm_up_cache($cache_key) } } } }
Dinleyici çağrıldığında, handle
yöntem, ilişkili olayın bir örneğiyle iletilir. Bizim durumumuzda, bunun bir örneği olmalıdır. ClearCache
ilk argüman olarak iletilecek olan olay sınıfı handle
yöntem.
Sonraki, yalnızca her bir önbellek anahtarının yinelenmesi ve ilgili önbelleklerin ısınması meselesidir.
Şimdi, şeyleri test etmek için her şeye sahibiz. Hızlı bir şekilde bir controller dosyası oluşturalım. app/Http/Controllers/EventController.php bir olayı nasıl yükseltebileceğinizi göstermek için.
<?php namespace AppHttpControllers; use AppHttpControllersController; use AppLibraryServicesContractsCustomServiceInterface; use AppPost; use IlluminateSupportFacadesGate; use AppEventsClearCache; class EventController extends Controller { public function index() { // ... // you clear specific caches at this stage $arr_caches = ['categories', 'products']; // want to raise ClearCache event event(new ClearCache($arr_caches)); // ... } }
İlk olarak, örneğini oluştururken ilk argüman olarak bir dizi önbellek anahtarı ilettik. ClearCache
Etkinlik.
bu event
helper işlevi, bir uygulama içinde herhangi bir yerden bir olay oluşturmak için kullanılır. Olay ortaya çıktığında, Laravel o olayı dinleyen tüm dinleyicileri çağırır.
Bizim durumumuzda, AppListenersWarmUpCache
dinleyici dinlemek üzere ayarlanmış AppEventsClearCache
Etkinlik. Böylece handle
yöntemi AppListenersWarmUpCache
olay bir denetleyiciden başlatıldığında dinleyici çağrılır. Gerisi temizlenen önbellekleri ısıtmak!
Böylece uygulamanızda özel olaylar oluşturabilir ve onlarla çalışabilirsiniz.
Etkinlik Abonesi Nedir?
Olay abonesi, tek bir yerde birden fazla olay dinleyicisine abone olmanızı sağlar. Olay dinleyicilerini mantıksal olarak gruplamak veya büyüyen olayları tek bir yerde toplamak istiyorsanız, aradığınız olay abonesidir.
Bu makalede şimdiye kadar tartışılan örnekleri olay abonesini kullanarak uygulasaydık, şöyle görünebilirdi.
<?php // app/Listeners/ExampleEventSubscriber.php namespace AppListeners; use IlluminateAuthEventsLogin; use AppEventsClearCache; class ExampleEventSubscriber { /** * Handle user login events. */ public function sendEmailNotification($event) { // get logged in username $email = $event->user->email; $username = $event->user->name; // send email notification about login... } /** * Handle user logout events. */ public function warmUpCache($event) { if (isset($event->cache_keys) && count($event->cache_keys)) { foreach ($event->cache_keys as $cache_key) { // generate cache for this key // warm_up_cache($cache_key) } } } /** * Register the listeners for the subscriber. * * @param IlluminateEventsDispatcher $events */ public function subscribe($events) { $events->listen( Login::class, [ExampleEventSubscriber::class, 'sendEmailNotification'] ); $events->listen( ClearCache::class, [ExampleEventSubscriber::class, 'warmUpCache'] ); } }
Bu subscribe
dinleyicileri kaydetmekten sorumlu olan yöntem. İlk argümanı subscribe
yöntem bunun bir örneğidir IlluminateEventsDispatcher
kullanarak dinleyicilerle olayları bağlamak için kullanabileceğiniz sınıf listen
yöntem.
İlk argümanı listen
method, dinlemek istediğiniz bir olaydır ve ikinci argüman, olay başlatıldığında çağrılacak bir dinleyicidir.
Bu şekilde, abone sınıfının kendisinde birden çok olay ve dinleyici tanımlayabilirsiniz.
Etkinlik abone sınıfı otomatik olarak alınmaz. adresinden kayıt olmanız gerekmektedir. EventServiceProvider.php altında sınıf $subscribe
özellik, aşağıdaki snippet’te gösterildiği gibi.
<?php namespace AppProviders; use IlluminateAuthEventsRegistered; use IlluminateAuthListenersSendEmailVerificationNotification; use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider; use IlluminateSupportFacadesEvent; use AppListenersWarmUpCache; use AppEventsClearCache; use AppListenersExampleEventSubscriber; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ ]; /** * The subscriber classes to register. * * @var array */ protected $subscribe = [ ExampleEventSubscriber::class, ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Bu, hizmetinizde olan olay abone sınıfıydı ve bununla birlikte bu makalenin de sonuna geldik.
Çözüm
Bugün Laravel’in birkaç heyecan verici özelliğinden bahsettik—etkinlikler ve dinleyiciler. Uygulama çapında olayları yükseltmenize ve diğer modüllerin bu olayları dinlemesine ve buna göre tepki vermesine izin veren gözlemci tasarım modeline dayanırlar.