لاراول با مجموعه ای قوی از ویژگی های طراحی شده برای ساده سازی وظایف پیچیده، راه را برای توسعه وب هموار می کند. یکی از این ویژگیها که اغلب نادیده گرفته میشود، اما فوقالعاده قدرتمند است، کلاس Observer در لاراول است. Observer در لاراول به توسعه دهندگان اجازه می دهند تا به رویدادهای مدل های مختلف به شیوه ای تمیز و سازمان یافته گوش دهند و به آن واکنش نشان دهند. در این مقاله از آنوفل، ما به دیزاین پترن Observer، پیاده سازی آنها و بهترین شیوه ها، به ویژه تمرکز بر لاراول 11 که آخرین ورژن در حال حاضر لاراول است، خواهیم پرداخت.
دیزاین پترن Observer در لاراول چیست؟
در لاراول، یک کلاس Observer به عنوان یک مکان مرکزی عمل می کند که می توانید شنوندگان رویداد را برای یک مدل خاص گروه بندی کنید. این بدان معنی است که می توانید رویدادهایی که توسط مدلهای Eloquent اجرا می شوند مانند ایجاد، به روز رسانی، حذف و بازیابی مدل ها را بدون درهم ریختن منطق برنامه خود مدیریت کنید ( استفاده از اصول سالید و کد نویسی تمیز). Observer ها مخصوصاً زمانی مفید هستند که میخواهید کد را در پاسخ به تغییرات چرخه عمر مدل اجرا کنید، در نتیجه به اصول SOLID طراحی شیگرا پایبند باشید.
الگوی طراحی Observer یک الگوی طراحی رفتاری است که وابستگی یک به چند را بین آبجکت ها تعریف می کند. هنگامی که یک آبجکت (موضوع) تغییر حالت می دهد، تمام وابستگان (Observer ها) آن به طور خودکار مطلع و به روز می شوند. این پترن به ویژه برای حفظ سازگاری بین آبجکت های مرتبط بدون اتصال محکم آنها مفید است.
دیزاین پترن Observer یکی از دیزاین پترن Gang of Four (GoF) است که هدف آن ترویج اتصال آزاد در طراحی نرم افزار است. از دو بخش اصلی تشکیل شده است:
سابجکت (قابل مشاهده- Observable): آبجکتی که حالت را نگه می دارد و در صورت تغییر حالت، اعلان هایی را برای Observer ها ارسال می کند.
Observer: آبجکتی که باید از تغییرات موضوع مطلع شود.
برای آشنایی با معماری ماژولار در لاراول این مقاله را بررسی کنید.
ایجاد Observer در لاراول
ایجاد Observer در لاراول 11 به Artisan ساده است. برای ایجاد یک Observer، از دستور make:observer
استفاده می کنید. به عنوان مثال، برای ایجاد یک Observer برای مدل User
، باید دستور زیر را اجرا کنید:
php artisan make:observer UserObserver --model=User
این دستور یک کلاس UserObserver
جدید را در دایرکتوری app/Observers
ایجاد می کند. اگر دایرکتوری وجود نداشته باشد، لاراول ایجاد آن را مدیریت خواهد کرد. در اینجا یک Observer
خام می بینید:
<?php
namespace App\Observers;
use App\Models\User;
class UserObserver
{
public function created(User $user): void {
// Code to run after a user is created
}
public function updated(User $user): void {
// Code to run after a user is updated
}
public function deleted(User $user): void {
// Code to run after a user is deleted
}
public function restored(User $user): void {
// Code to run after a user is restored
}
public function forceDeleted(User $user): void {
// Code to run after a user is permanently deleted
}
}
ثبت Observer ها
برای فعال کردن یک Observer، باید آن را با مدلی که باید مشاهده کند، ثبت کنید. لاراول 11 با ویژگی ObservedBy
رویکردی شفافتر را معرفی میکند که به روشی شفافتر و واضحتر برای پیوند Observer ها به مدلها اجازه میدهد:
use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
#[ObservedBy([UserObserver::class])]
class User extends Authenticatable {
// Model methods here
}
از طرف دیگر، می توانید به صورت دستی یک Observer را در AppServiceProvider
خود ثبت کنید:
use App\Models\User;
use App\Observers\UserObserver;
public function boot(): void {
User::observe(UserObserver::class);
}
برای آشنایی با 20 نکته و ترفند الکونت در لاراول این مقاله را از دست ندهید.
Observer ها و دیتابیس Transaction
یک ویژگی جدید در لاراول 11 مدیریت Observer ها در تراکنش های دیتابیس است. می توان به Observer ها دستور داد که تنها پس از انجام تراکنش پایگاه داده، با استفاده از اینترفیس ShouldHandleEventsAfterCommit
، کنترلر رویداد خود را اجرا کنند:
namespace App\Observers;
use App\Models\User;
use Illuminate\Contracts\Events\ShouldHandleEventsAfterCommit;
class UserObserver implements ShouldHandleEventsAfterCommit {
public function created(User $user): void {
// This will only run after the transaction is committed
}
}
ارسال ایمیل خوش آمد گویی با Observer
اگر می خواهید هنگام ثبت نام برای کاربران ایمیل خوشامدگویی ارسال کنید، می توانید این کار را با متد created
انجام دهید:
<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeEmail;
class UserObserver
{
public function created(User $user)
{
Mail::to($user->email)->send(new WelcomeEmail($user));
}
}
بهترین روش ها با Observer
هنگام استفاده از Observer ها، بهترین شیوه های زیر را در نظر داشته باشید:
روشن نگه دارید: Observer ها باید کارهای سبک را انجام دهند تا از مشکلات عملکردی جلوگیری کنند. پردازش های سنگین باید به جاب ها داده شود.
اصل تک مسئولیتی: هر متد Observer باید یک وظیفه یا مجموعه ای از وظایف خاص را انجام دهد.
تست: همیشه برای متد های Observer خود تستهایی بنویسید تا مطمئن شوید که طبق انتظار بدون ساید افکت عمل میکنند. برای آشنایی با تست نویسی در لاراول اینجا را بررسی کنید.
استفاده از Observer ها در لاراول
Observer ها در سناریوهای مختلف مفید هستند، مانند:
ثبت تغییرات: ردیابی تغییرات در وضعیت مدل برای اهداف ممیزی.
ارسال اعلان ها: به کاربران یا سایر سیستم ها در مورد تغییرات یک مدل اطلاع دهید.
بهروزرسانی مدلهای مرتبط: بروزرسانی خودکار مدلهای مرتبط در صورت ایجاد تغییر.
برای آشنایی با تزریق وابستگی و سرویس کانتینر ها در لاراول این مقاله را از دست ندهید.
زمان استفاده از پترن Observer
الگوی Observer زمانی ایدهآل است که شما نیاز به جداسازی نگرانیها دارید و از جفت شدن شدید بین مدل و اکشن های انجام شده روی رویدادهای آن اجتناب کنید. از الگوی Observer در لاراول استفاده کنید زمانی که:
- جداسازی منطق : شما میخواهید مدلهای خود را تمیز نگه دارید و از مسئولیتهای اضافی دور نگه دارید.
- حفظ اصل تک مسئولیتی: هر کلاس باید یک مسئولیت داشته باشد و Observer ها با مدیریت لاجیک رویداد به طور جداگانه به حفظ این اصل کمک می کنند.
- قابلیت استفاده مجدد: Observer ها را می توان در مدل های مختلف یا حتی در پروژه های مختلف مورد استفاده مجدد قرار داد.
- مقیاس پذیری: با رشد برنامه شما، مدیریت و مقیاس پذیری با Observer هایی که لاجیک رویدادهای مدل را مدیریت می کنند، آسان تر می شود.
دیزاین پترن Observer در مقابل Event
Observer ها اساساً رویدادهای از پیش تعریفشدهای هستند که فقط در مدلهای Eloquent (ایجاد رکورد، بهروزرسانی رکورد، حذف و غیره) اتفاق میافتند. رویدادها عمومی هستند، از پیش تعریف نشدهاند و میتوانند در همه جا استفاده شوند، نه فقط در مدلها.
و این نکته را دقت کنید که Observer ها و رویدادها اصلاً یک کار را انجام نمی دهند.
یک Observer موارد خاصی را که در الکونت میافتند، مانند ذخیره کردن، ذخیرهسازی، حذف کردن، حذفشده را تماشا میکند (موارد بیشتری وجود دارد..). Observer ها به طور خاص به یک مدل مقید هستند.
رویداد ها:
رویدادها (Event) اقداماتی هستند که توسط هر چیزی که برنامه نویس می خواهد انجام می شود. اگر میخواهید زمانی که شخصی صفحهای را بارگیری میکند، رویدادی را فعال کنید، میتوانید این کار را انجام دهید. برخلاف Observer ها، رویدادها نیز می توانند در صف باشند و از طریق کرون لاراول اجرا شوند. رویدادها به طور موثر توسط برنامه نویس تعریف می شوند. آنها به شما توانایی انجام اقداماتی را می دهند که نمی خواهید کاربر منتظر آنها بماند (مثلا خرید یک پادکست)
نتیجه
Observer ها در لاراول 11 روشی قوی و زیبا برای مدیریت دقیق و مختصر رویدادهای مدل ارائه می دهند. با استفاده از قابلیتهای کامل Observer، توسعهدهندگان میتوانند کدهای قابل نگهداری، مقیاسپذیر و پاکتر بنویسند و به بهترین شیوههای مدرن در توسعه نرمافزار پایبند باشند. همانطور که به کاوش لاراول 11 ادامه می دهید، Observer را در مدل های خود ادغام کنید تا کد خود را منظم نگه دارید و بر مسئولیت های اصلی آن متمرکز شوید. برای موارد بیشتر آنوفل را در شبکه های اجتماعی دنبال کنید.