MuratCanKuru Laravel içerisinde iki çeşit event bulunur: Sizin tanımladıklarınız ve Laravel'de halihazırda bulunanlar (Paketlerden gelenleri de sizin tanımladıklarınız içerisinde sayıyorum).
Laravel'de belli yerlerde bazı olaylar ateşlenir (üstte bahsettiğim halihazırda olan olaylar). Mesela kullanıcı giriş yapmaya çalışırken giriş bilgileri doğrulandığında Illuminate\Auth\Events\Authenticated; giriş gerçekleştiğinde Illuminate\Auth\Events\Login, bir sorgu çalıştığında Illuminate\Database\Events\QueryExecuted, bir Job başarısız olduğunda Illuminate\Queue\Events\JobFailed vs... olayları ateşlenir. Siz bunlar dinleyen Listener'lar yazarak bu olaylar geçekleştiğinde bazı işlemleri yaptırabilirsiniz. Bu işlemler şunun gibi soruların cevaplarıdır: Yapılan db sorgularını nasıl görebilirim? Kullanıcı giriş yaptığında nasıl loglayabilirim? Bir Job başarısız olduğunda bana mail gelsin istiyorum nasıl yapabilirim? vs...
Bunun gibi bir çok halihazırda olay var. Ayrıca Eloquent de kendine özel olaylara sahiptir. Bir model yaptığı işleme göre retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored, ve replicating olaylarını ateşler. Bu olayları yakalamanın birden fazla yolu var. Bunlara listener yazılabileceği gibi direkt model içinde ya da kendine has yöntemlerle (https://laravel.com/docs/8.x/eloquent#events) halledilebilir. Model::$dispatchesEvents özelliği model olaylarını kullanmanın yollarıdan bir tanesidir.
Soruya gelince, Model kayıt oluşturunca creating, created, saving, saved olaylarını ateşler. Siz bunlardan biriyle işlem yapmak istediğinizde karar vereceksiniz:
Kayıt oluşmadan önce title alanından slug oluştursun.
Bu işlem direkt Eloquent düzeyinde halledilebilecek bir işlem. Listener kullanmaya gerek yok, direkt model event ile halledilebilir.
Kayıt oluştuktan sonra başka bir kayıt daha eklesin
Eğer kayıt işlemi basit bir işlem ise model event ile yapılabilir fakat dışarıdan Request gibi ayrı bir katmana ihtiyaç duyuyorsa, HTTP katmanına yakın bir işlem ise, uygulamanın Business tarafı ile ilgili basit ya da kompleks bir işlem ise Listener kullanılabilir. Kullanılır demiyorum kullanılabilir diyorum çünkü analiz edilip karar verilmesi gerekiyor
Kayıt oluşturulduktan sonra mail göndersin
Listener kullanılması uygun olur çünkü Mail gibi Business'a yakın bir yapıyı Database gibi uygulamanın derinlerinde bir katmanda kullanmak uygun olmaz.
Bu ayrımları kolay yapmanın yolu ise yazılım mimarisi ile tasarım desenlerine hakimiyet ve nihayetinde tecrübedir. Projenin düzgün analiz edilmesi gerekir. Bırakın müşterinin istediğini, bırakın bir servisi ya da sınıfı, bir yöntemin bile kendi yaşam döngüsü olduğu düşünülmeli ve bir karakteri olmalıdır. createCampus() deyip içine hubele hubele dalarsanız bu iş yine olmaz.
Bu arada Laravel'e ait bazı olaylar (güncel olmayabilir). İsimlerinden ne zaman ateşlendikleri anlaşılabilir:
Illuminate\Auth\Events\Attempting
Illuminate\Auth\Events\Authenticated
Illuminate\Auth\Events\Failed
Illuminate\Auth\Events\Lockout
Illuminate\Auth\Events\Login
Illuminate\Auth\Events\Logout
Illuminate\Auth\Events\PasswordReset
Illuminate\Auth\Events\Registered
Illuminate\Auth\Events\Verified
Illuminate\Cache\Events\CacheEvent
Illuminate\Cache\Events\CacheHit
Illuminate\Cache\Events\CacheMissed
Illuminate\Cache\Events\KeyForgotten
Illuminate\Cache\Events\KeyWritten
Illuminate\Console\Events\ArtisanStarting
Illuminate\Console\Events\CommandFinished
Illuminate\Console\Events\CommandStarting
Illuminate\Database\Events\ConnectionEvent
Illuminate\Database\Events\QueryExecuted
Illuminate\Database\Events\StatementPrepared
Illuminate\Database\Events\TransactionBeginning
Illuminate\Database\Events\TransactionCommited
Illuminate\Database\Events\TransactionRolledBack
Illuminate\Log\Events\MessageLogged
Illuminate\Mail\Events\MessageSending
Illuminate\Mail\Events\MessageSent
Illuminate\Notifications\Events\BroadcastNotificationCreated
Illuminate\Notifications\Events\NotificationFailed
Illuminate\Notifications\Events\NotificationSending
Illuminate\Notifications\Events\NotificationSent
Illuminate\Queue\Events\JobExceptionOccured
Illuminate\Queue\Events\JobFailed
Illuminate\Queue\Events\JobProcessed
Illuminate\Queue\Events\JobProcessing
Illuminate\Queue\Events\Looping
Illuminate\Queue\Events\WorkerStopping
Illuminate\Redis\Events\CommandExecuted
Illuminate\Routing\Events\RouteMatched