
دسترسی سریع به عناوین این مقاله
الگوی طراحی observer یا observer design patern
دیزاین پترن ها راه حال های قابل تکرار برای چالش های رایج در طراحی نرم افزار هستند.یکی از این دیزاین پترن ها الگوی طراحی observer است .که معمولا برای ارتباط یک به چند بین اشیا کاربرد دارد.به گونه ای که تغییر در یک شی نیاز به تغییر در چند شی دارد.
اگر شما ار فریم ورک ها مطرح php استفاده کرده باشید .حتما از این دیزاین پترن به نوعی استفاده کرده اید بطور مثال در فریم ورک سیموفنی هنگام استفاده از EventDispatcher از الگوی طراحی observer استفاده میکنید.در فریم ورک مدرن دیگر php مانند Laravel هم در هنگام استفاده از شنونده های از این الگو طراحی استفاده میشود.اگر نحوه پیاده سازی این دیزاین پترن را بدانیم در صورت بروز مشکل راحت تر میتوانیم آن مشکل را برطرف کنیم.
الگوی Observer یک وابستگی یک به چند است بدین معنی که وقتی یک شیء تغییر میکند بطور خودکار به همه اشیاء وابسته به ان اطلاع داده میشود و انها به روز میشوند.
پیاده سازی observer pattern در php
برای شروع میتوانیم یک مثال از Eloquent
ها در لاراول بزنیم. هر مدلی که در eloquent لاراول ایجاد می کنیم در داخل خود دارای این الگو است.
برای مثال ما یک مدل به نام Car
ایجاد می کنیم. در این مدل ما نوع ماشین، رنگ ماشین، سال ساخت و توضیحات را داریم.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
{
//
}
برای ساختن یک observer
میتوانیم از دستور php artisan make:observer observer_name
استفاده کنیم که به جای observer_name
از یک نام دلخواه استفاده می کنیم.
این دستور یک کلاس php در مسیر app\observers
می سازد که هیچ محتوایی ندارد.
به صورت زیر:
<?php
namespace App\Observers;
class CarObserver
{
}
در Eloquent لاراول یک سری توابع به صورت پیشفرض ساخته شده اند که ما می توانیم آن ها را بازنویسی کرده و از آن ها استفاده کنیم. لیست این توابع به صورت زیر می باشد:
Creating
: این تابع قبل از این که رکورد جدیدی بسازیم صدا زده میشود.Created
: این تابع بعد از این که رکورد جدیدی ساخته شد صدا زده میشود.Updating
: این تابع قبل از این که رکوردی را بهروزرسانی کنیم صدا زده میشود.Updated
: این تابع بعد از این که رکوردی را بهروزرسانی کردیم صدا زده میشود.Saving
: این تابع قبل از این که رکوردی ذخیره شود صدا زده میشود. (یا ساخته شود یا بهروزرسانی شود)Saved
: این تابع بعد از این که رکوردی ذخیره شد صدا زده میشود (یا ساخته شود یا بهروزرسانی شود)Deleting
: این تابع قبل از این که رکوردی حذف شود صدا زده میشود.Deleted
: این تابع بعد از این که رکوردی حذف شد صدا زده میشود.Restoring
: این تابع قبل از این که رکوردی بازیابی شود صدا زده میشود.Restored
: این تابع بعد از این که رکوردی بازیابی شد صدا زده میشود.
بعد از ایجاد توابع با این نامها، تنها باید به لاراول بگوییم که این فایل observer
برای چه کلاسی است.
<?php
namespace App\Observers;
class CarObserver
{
public function creating($model)
{
print "creating model" . PHP_EOL;
}
public function created($model)
{
print "Created model" . PHP_EOL;
}
public function updating($model)
{
print "Updating model" . PHP_EOL;
}
public function updated($model)
{
print "updated model" . PHP_EOL;
}
public function saving($model)
{
print "saving model" . PHP_EOL;
}
public function saved($model)
{
print "saved model" . PHP_EOL;
}
public function deleting($model)
{
print "deleting model" . PHP_EOL;
}
public function deleted($model)
{
print "deleted model" . PHP_EOL;
}
public function restoring($model)
{
print "restoring model" . PHP_EOL;
}
public function restored($model)
{
print "restored model" . PHP_EOL;
}
}
برای این کار می توانیم در فایل AppServiceProvider
بگوییم که این فایل observer
برای چه مدلی می باشد. (برای این کار بهتر است یک Service Provider
جدید ساخته و در آن جا تعریف شود)
<?php
namespace App\Providers;
use App\Car;
use App\Observers\CarObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Car::observe(CarObserver::class);
}
}
بعد از این کار خروجی کد های ما به این صورت می شود.
$car1 = new Car;
$car1->description = "cool car description";
$car1->color = 'black';
$car1->manufacturer = 'Honda';
$car1->year = '2012';
print "\nCreating new car\n";
$car1->save();
خروجی
Creating new car
saving model
creating model
Created model
saved model
در مثالی دیگر
$car1 = Car::find(1);
$car1->color = 'blue';
print "\nSaving car #1 to database\n";
$car1->save();
خروجی
Saving car #1 to database
saving model
Updating model
updated model
saved model
نتیجه
معماری رویداد محور (Event-driven architecture) یک الگوی معماری نرمافزار است، که به وسیله آن میتوان تمام اتفاقات را ضبط و پردازش کرده و ارتباط وقایع با یکدیگر را کنترل و پیادهسازی کنیم. در این الگوی طراحی یک سری اتفاقاتی انجام میشوند که به وسیله observe
ها با یکدیگر ارتباط داده شده و یک سیستم یکپارچه را به وجود میآورند.
- تغییر اندازه عکس در PHP یا لاراول
- لیست شرکت های خلاق حوزه کسب و کارهای دیجیتال و فضای مجازی
- الگوریتم اعتبارسنجی کد شبا بانکی
- آشنایی با پیام های http
- مقدمه آموزش اصول برنامه نویسی