نماها
معرفی
نماها یک رابط "ایستا" را برای کلاس هایی که در کانتینر IoC برنامه در دسترس هستند ارائه می کنند . کشتی های لاراول با نماهای بسیار زیاد، و شما احتمالا بدون اینکه بدانید از آنها استفاده کرده اید! «نماهای» لاراول بهعنوان «پراکسیهای استاتیک» برای کلاسهای زیرین در ظرف IoC عمل میکنند و از یک نحو مختصر و رسا بهره میبرند و در عین حال تستپذیری و انعطافپذیری بیشتری نسبت به روشهای استاتیک سنتی حفظ میکنند.
گاهی اوقات، ممکن است بخواهید نماهای خود را برای برنامه ها و بسته های خود ایجاد کنید، بنابراین بیایید مفهوم، توسعه و استفاده از این کلاس ها را بررسی کنیم.
توجه: قبل از حفاری در نماها، اکیداً توصیه می شود که با کانتینر IoC لاراول آشنا شوید .
توضیح
در زمینه برنامه لاراول، نما کلاسی است که دسترسی به یک شی را از کانتینر
فراهم می کند.
ماشین آلاتی که این کار را می کند در
Facade
کلاس است.
نماهای لاراول و هر نمای سفارشی که ایجاد می کنید،
Facade
کلاس پایه را گسترش می دهد.
کلاس نما شما فقط نیاز به پیاده سازی یک روش دارد:
getFacadeAccessor
.
این
getFacadeAccessor
وظیفه روش است که مشخص کند چه چیزی را از ظرف حل کند.
کلاس پایه از
روش جادویی برای به تعویق انداختن تماس ها از نمای شما به شی حل شده
Facade
استفاده می کند .
__callStatic()
بنابراین، هنگامی که یک فراخوانی مانند نما انجام می دهید
Cache::get
، لاراول کلاس مدیر کش را از ظرف IoC خارج می کند و
get
متد را در کلاس فراخوانی می کند.
از نظر فنی، Laravel Facades یک نحو مناسب برای استفاده از کانتینر Laravel
IoC به عنوان مکان یاب سرویس است.
استفاده عملی
در مثال زیر، یک تماس با سیستم کش لاراول برقرار شده است.
با نگاهی اجمالی به این کد، می توان فرض کرد که متد استاتیک
get
در کلاس فراخوانی می شود
Cache
.
$value = Cache::get('key');
با این حال، اگر به آن کلاس نگاه کنیم
Illuminate\Support\Facades\Cache
، خواهید دید که هیچ متد ثابتی وجود ندارد
get
:
class Cache extends Facade { /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'cache'; } }
کلاس Cache
Facade
کلاس پایه را گسترش می دهد و یک متد را تعریف می کند
getFacadeAccessor()
.
به یاد داشته باشید، وظیفه این روش بازگشت نام یک اتصال IoC است.
هنگامی که کاربر به هر روش ثابتی در
Cache
نما ارجاع می دهد، لاراول
cache
اتصال از کانتینر IoC را حل می کند و روش درخواستی (در این مورد،
get
) را بر روی آن شی اجرا می کند.
بنابراین،
Cache::get
تماس ما می تواند به این صورت دوباره نوشته شود:
$value = $app->make('cache')->get('key');
ایجاد نما
ایجاد نما برای برنامه یا پکیج خود ساده است. شما فقط به 3 چیز نیاز دارید:
- یک اتصال IoC.
- کلاس نما.
- پیکربندی نام مستعار نما.
بیایید به یک مثال نگاه کنیم.
در اینجا، ما یک کلاس داریم که به صورت تعریف شده است
PaymentGateway\Payment
.
namespace PaymentGateway; class Payment { public function process() { // } }
این کلاس ممکن است در
app/models
دایرکتوری شما یا هر دایرکتوری دیگری که Composer می داند چگونه آن را به
طور خودکار بارگذاری کند، زندگی می کند.
ما باید بتوانیم این کلاس را از ظرف IoC حل کنیم. بنابراین، بیایید یک اتصال اضافه کنیم:
App::bind('payment', function(){ return new \PaymentGateway\Payment;});
یک مکان عالی برای ثبت این اتصال ایجاد یک
ارائه دهنده سرویس
جدید به نام
PaymentServiceProvider
و افزودن این اتصال به
register
روش است.
سپس می توانید لاراول را پیکربندی کنید تا ارائه دهنده خدمات خود را از
app/config/app.php
فایل پیکربندی بارگیری کند.
بعد، ما می توانیم کلاس نما خود را ایجاد کنیم:
use Illuminate\Support\Facades\Facade; class Payment extends Facade { protected static function getFacadeAccessor() { return 'payment'; } }
در نهایت، در صورت تمایل، می توانیم یک نام مستعار برای نمای خود به
aliases
آرایه موجود در
app/config/app.php
فایل پیکربندی اضافه کنیم.
اکنون میتوانیم
process
متد را در نمونهای از
Payment
کلاس فراخوانی کنیم.
Payment::process();
نکته ای در مورد بارگذاری خودکار نام های مستعار
کلاسهای موجود در
aliases
آرایه در برخی موارد در دسترس نیستند زیرا
PHP سعی نمیکند کلاسهای نوع اشارهشده تعریفنشده را بهطور خودکار
بارگیری کند
.
اگر
\ServiceWrapper\ApiTimeoutException
نام مستعار باشد
ApiTimeoutException
،
catch(ApiTimeoutException $e)
خارج از فضای نام
\ServiceWrapper
هرگز استثنا را نمی گیرد، حتی اگر یکی پرتاب شود.
مشکل مشابهی در مدلهایی که به کلاسهای مستعار اشاره دارند یافت میشود.
تنها راه حل این است که از نام مستعار صرف نظر کنید و
use
کلاس هایی را که می خواهید تایپ کنید hint در بالای هر فایلی که به آنها
نیاز دارد، صرف نظر کنید.
نماهای تقلید
تست واحد یکی از جنبه های مهم این است که چرا نماها به روشی که انجام می دهند کار می کنند. در واقع، آزمایش پذیری دلیل اصلی حتی وجود نماها است. برای اطلاعات بیشتر، بخش نماهای تقلید آمیز اسناد را بررسی کنید .
مرجع کلاس نما
در زیر هر نما و طبقه زیرین آن را خواهید یافت. این یک ابزار مفید برای کاوش سریع در اسناد API برای ریشه نما معین است. کلید اتصال IoC نیز در صورت لزوم گنجانده شده است.