نسخه:

نماها

معرفی

نماها یک رابط "ایستا" را برای کلاس هایی که در کانتینر 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 نیز در صورت لزوم گنجانده شده است.

نما کلاس IoC Binding
برنامه Illuminate\Foundation\Application app
صنعتگر Illuminate\Console\Application artisan
احراز هویت Illuminate\Auth\AuthManager auth
Auth (نمونه) Illuminate\Auth\Guard
تیغه Illuminate\View\Compilers\BladeCompiler blade.compiler
حافظه پنهان Illuminate\Cache\Repository cache
پیکربندی Illuminate\Config\Repository config
کوکی Illuminate\Cookie\CookieJar cookie
دخمه Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB (نمونه) Illuminate\Database\Connection
رویداد Illuminate\Events\Dispatcher events
فایل Illuminate\Filesystem\Filesystem files
فرم Illuminate\Html\FormBuilder form
هش Illuminate\Hashing\HasherInterface hash
HTML Illuminate\Html\HtmlBuilder html
ورودی Illuminate\Http\Request request
لنگ Illuminate\Translation\ Translator translator
ورود به سیستم Illuminate\Log\Writer log
ایمیل Illuminate\Mail\Mailer mailer
صفحه بندی کننده Illuminate\Pagination\Factory paginator
صفحه‌نگار (نمونه) Illuminate\Pagination\Paginator
کلمه عبور Illuminate\Auth\Reminders\PasswordBroker auth.reminder
صف Illuminate\Queue\QueueManager queue
صف (نمونه) Illuminate\Queue\QueueInterface
صف (کلاس پایه) روشن کردن\Queue\Queue
تغییر مسیر Illuminate\Routing\Redirector redirect
ردیس Illuminate\Redis\Database redis
درخواست Illuminate\Http\Request request
واکنش Illuminate\Support\Facades\Response
مسیر Illuminate\Routing\Router router
طرحواره Illuminate\Database\Schema\Blueprint
جلسه Illuminate\Session\SessionManager session
جلسه (نمونه) Illuminate\Session\Store
SSH Illuminate\Remote\RemoteManager remote
SSH (نمونه) Illuminate\Remote\Connection
URL Illuminate\Routing\UrlGenerator url
اعتبار سنجی Illuminate\Validation\Factory validator
اعتبار سنجی (نمونه) Illuminate\Validation\Validator
چشم انداز Illuminate\View\Factory view
مشاهده (نمونه) Illuminate\View\View