آموزش Real-Time Facade در لاراول

آموزش Real-Time Facade در لاراول

قابلیت Real-time Facades در لاراول یک ویژگی است که به شما اجازه می‌دهد از کلاس‌های عادی خود به صورت یک Facade استفاده کنید. این ویژگی به شما کمک می‌کند تا از مزایای Facade‌ ها بدون نیاز به تعریف صریح یک Facade در فایل‌های خود بهره‌مند شوید. در واقع، Realtime Facades به طور خودکار یک Facade برای کلاس شما ایجاد می‌کند.

 

روش ساخت Real-Time Facade در لاراول

خب فرض کنید که ما یک کلاس داریم به نام EmailWorker و یک سری متد درونش هست:

class EmailWorker
{
public function send(): void
{
// ...
}

public function driver(): string
{
return 'google';
}
}

حالا ما اگه بخوایم از این کلاس استفاده کنیم به احتمال زیاد از این روش باید استفاده کنیم:

(new EmailWorker)->send();
resolve(EmailWorker::class)->send();

 

خب ما اگه بخوایم بدون اینکه شی بسازیم به متد ها دسترسی داشته باشیم شاید باید کلاس static کنیم یا یک فساد (Facade) ایجاد کنیم:

public static function send(): void
{
// ...
}

public static function driver(): string
{
return 'google';
}

یا میتونیم از فساد ها استفاده کنیم که قبلا یک مقاله در موردش درست کردیم. (آموزش ساخت Facade در لاراول)

اما شاید این گزینه ها مناسب نباشند یا حتی هزینه فنی الکی برامون درست کنند.

گزینه سوم استفاده از Real-Time Facade لاراول هست، برای اینکار کافیه که فقط برای استفاده از کلمه Facade اول کلاس استفاده شود:

(new AppServicesEmailWorker)->send();
FacadeAppServicesEmailWorker::send();

به همین راحتی :)

حالا ما میتونیم به متد های کلاس به صورت یک فساد دسترسی داشته باشیم بدون نیاز به ایجاد بدهی فنی.

 

پشت پرده Real-Time Facade چیه؟

خب ما مثل همیشه جزئیات کار هم میگیم، شاید براتون سوال باشه که چجوری این داستان لاراول هندل میکنه؟

 لاراول با استفاده از AutoLoading و AliasLoader میاد از اون کلاس یک کپی میگیره و درون فولدر storage قرار میده و زمانی که ما کلمه Facades  قبل از کلاس قرار میدهیم از طریق اون میره داخل فولدر Storage و کلاس پیدا میکنه و ازش استفاده میکنه.

 

روش تست نویسی Real-Time Facade ها در لاراول چجوریه؟

اگه براتون سواله که چجوری میشه برای Real-Time Facade ها تست نوشت باید بگم خیلی ساده!

public function test_send_email(): void
{
EmailWorker::shouldReceive('send')->once();
}

نکته ای که نیاز هست بگم این هست که شما باید به صورت شکل پایین کلاس رو درون تست ها use کنید:

use FacadesAppContractsPublisher;

0 نظر

برای ارسال نظر ابتدا ثبت نام یا ورود کنید 😉