تالار گفتمان nCIS.ir

نسخه‌ی کامل: آموزش گام به گام لاراول
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
این آموزش براساس مستندات رسمی سایت LARAVEL تولید شده و با اندکی تغییرات که جهت استفاده‌ی کاربران عزیز ایرانی راحت‌تر باشد، به‌مرور در اختیار علاقمندان قرار می‌گیرد. دقت‌کنید که این آموزش درحال تکمیل تدریجی است و علاوه‌بر محتوای متنی، پس‌از تکمیل به‌صورت آموزش تصویری نیز ازطریق فروشگاه محصولات آموزشی nCIS در اختیار علاقمندان خواهد بود.



سرفصل‌ها: این فهرست به‌مرور تکمیل خواهد شد.
پیشنیازهای سرور

فریمورک Laravel پیشنیازهای سیستم کمی دارد. تمام این پیشنیازها در ماشین مجازی Homestead برآورده شده‌اند، بنابراین شدیداً توصیه می‌شود که از هوم‌استِد بعنوان محیط توسعه‌ی محلی لاراول خود استفاده کنید.

بهرحال، اگر شما از Homestead استفاده نمی‌کنید، لازم است مطمئن‌شوید که سرور شما این نیازمندی‌ها را دارد:
  • PHP نسخه‌ی 7.1.3 یا بالاتر
  • افزونه‌ی OpenSSL برروی PHP
  • افزونه‌ی PDO برروی PHP
  • افزونه‌ی Mbstring برروی PHP
  • افزونه‌ی Tokenizer برروی PHP
  • افزونه‌ی XML برروی PHP
  • افزونه‌ی Ctype برروی PHP
  • افزونه‌ی JSON برروی PHP
  • افزونه‌ی BCMath برروی PHP
نصب لاراول

لاراول از Composer برای مدیریت وابستگی‌هایش استفاده می‌کند. بنابراین، قبل‌از استفاده از Laravel اطمینان‌یابید که کامپوزر برروی ماشین شما نصب شده است.

ازطریق نصب‌کننده‌ی لاراول

ابتدا نصب‌کننده‌ی لاراول را با استفاده از کامپوزر نصب کنید:
composer global require laravel/installer

مطمئن‌شوید که پوشه‌ی bin عرضه‌کننده‌ی سیستمی کامپوزر را در $PATH خود قرار داده‌اید تا فایل اجرایی لاراول بتواند توسط سیستم شما شناسایی شود. این پوشه براساس سیستم‌عامل شما، در مکان‌های متفاوتی قرار دارد؛ هرچند برخی از مکان‌های رایج به‌شرح زیر است:
  • macOS : مسیر $HOME/.composer/vendor/bin
  • توزیع‌های GNU / Linux : مسیر $HOME/.config/composer/vendor/bin
  • Windows : مسیر %USERPROFILE%AppDataRoamingComposervendorbin

وقتی که نصب انجام شد، دستور laravel new یک نصب تازه‌ی لاراول در پوشه‌ی موردنظر شما ایجاد خواهد کرد. برای مثال دستور
laravel new blog
یک پوشه به‌نام blog شامل یک نصب تازه‌ی لاراول خواهد ساخت که تمامی نیازمندی‌های Laravel از قبل در آن قرار گرفته‌اند.

ازطریق دستور Create-Project کامپوزر

بعنوان یک روش جایگزین، می‌توانید لاراول را با اجرای دستور create-project کامپوزر در خط‌فرمان نصب کنید:
composer create-project --prefer-dist laravel/laravel blog

سرور توسعه‌ی داخلی

اگر PHP را بصورت محلی (Local) نصب کرده‌اید و می‌خواهید از سرور توسعه‌ی داخلی PHP برای سرویس‌دهی به برنامه‌ی خود استفاده کنید، می‌توانید از دستور serve ابزار Artisan لاراول استفاده کنید. این دستور یک سرور توسعه به نشانی http://localhost:8000 راه‌اندازی خواهد کرد:
php artisan serve

گزینه‌های قدرتمندتر توسعه‌ی محلی ازطریق Homestead و Valet در دسترس هستند.
تنظیمات

پوشه‌ی عمومی

بعد از نصب لاراول، باید ریشه‌ی وب/اسناد وب‌سرور خود را برروی پوشه‌ی public تنظیم کنید. فایل index.php موجود در این پوشه بعنوان کنترلر پیشتاز برای تمامی درخواست‌های HTTP که وارد برنامه‌ی شما می‌شوند، عمل می‌کند.

فایل‌های تنظیمات

تمامی فایل‌های پیکربندی فریمورک لاراول در پوشه‌ی config قرار گرفته‌اند. هر گزینه مستندسازی شده‌است، بنابراین آزاد هستید که نگاهی به فایل‌ها بیندازید و با گزینه‌هایی که در اختیار شما هستند، آشنا شوید.

مجوزهای پوشه‌ها

بعد از نصب لاراول، ممکن‌است نیاز به تنظیم برخی مجوزها داشته باشید. پوشه‌های موجودر در مسیر storage و bootstrap/cache باید توسط وب‌سرور شما قابل نوشتن باشند و درغیر اینصورت لاراول اجرا نخواهد شد. اگر از ماشین مجازی Homestead استفاده می‌کنید، این مجوزها باید از قبل تنظیم شده باشند.

کلید برنامه

مورد بعدی که باید بعد از نصب Laravel تنظیم کنید، کلید برنامه است که باید یک رشته‌ی تصادفی باشد. اگر لاراول را ازطریق کامپوزر یا نصب‌کننده‌ی لاراول نصب کرده باشید، این کلید از قبل برای شما با اجرای دستور php artisan key:generate تنظیم شده است.

این کلید نوعاً باید یک رشته‌ی 32 کارکتری باشد. کلید می‌تواند در فایل محیطی .env تنظیم شود. اگر فایل .env.example را به .env تغییرنام نداده‌اید، اکنون باید این‌کار را انجام دهید. اگر کلید برنامه تنظیم نشود، نشست‌ها (Session) کاربران شما و سایر داده‌های رمزنگاری‌شده امن نخواهد بود!

تنظیمات بیشتر

لاراول تقریباً به پیکربندی دیگری نیاز ندارد. شما آزاد هستید که کار توسعه را شروع کنید! هرچند ممکن‌است بخواهید فایل config/app.php و مستندات آنرا بازبینی‌کنید. این فایل شامل گزینه‌های متعددی نظیر منطقه‌ی زمانی timezone و تنظیمات بومی‌سازی locale است که ممکن‌است بخواهید برحسب برنامه‌ی خود تغییر دهید.

همچنین احتمال دارد که بخواهید برخی عناصر جانبی لاراول را نیز پیکربندی نمایید، مثل:
تنظیمات وب‌سرور

URLهای زیبا

لاراول شامل یک فایل public/.htaccess است که برای تولید URLهای بدون کنترلر پیشتاز index.php در مسیر به‌کار می‌رود. قبل‌از سرویس‌دهی به لاراول توسط Apache مطمئن‌شوید که ماژول mod_rewrite را فعال کرده‌اید تا فایل .htaccess توسط سرور به رسمیت شناخته شود.

اگر فایل .htaccess که همراه لاراول ارائه شده است، در نسخه‌ی Apache نصب‌شده روی سیستم شما کار نکرد، از این جایگزین استفاده کنید:
Options +FollowSymLinks -Indexes
RewriteEngine On

RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Nginx

اگر از Nginx استفاده می‌کنید، این فایل هدایت‌گر در تنظیمات سایت شما می‌تواند تمام درخواست‌ها را به‌سمت کنترلر پیشتاز index.php هدایت نماید:
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

وقتی از Homestead یا Valet استفاده می‌کنید، URLهای زیبا بطور پیشفرض پیکربندی شده‌اند.
مفاهیم معماری

چرخه‌ی حیات درخواست

مقدمه

وقتی از هر ابزاری در «دنیای واقعی» استفاده می‌کنید، درصورتی‌که نحوه‌ی کارکرد آنرا بدانید، اعتماد به نفس بیشتری را حس می‌کنید. توسعه‌ی برنامه نیز تفاوتی ندارد. وقتی که بدانید چگونه ابزارهای توسعه‌ی شما کار می‌کنند، احساس راحتی بیشتری خواهید داشت و در استفاده از آنها از اعتماد به نفس بیشتری بهره‌مند خواهید بود.

هدف از این سند، اعطای یک دید کلی سطح بالا و خوب از چگونگی کارکرد فریمورک لاراول به شماست. با بهبود شناخت درمورد چهارچوب کلی فریمورک، همه‌چیز کمتر حس «جادویی» خواهد داشت و شما برروی توسعه‌ی برنامه‌ی خود مسلط‌تر خواهید بود. اگر تمام اصطلاحات را اکنون درک نمی‌کنید، سکته نکنید! فقط سعی کنید که یک فهم کلی از آنچه که در جریان است بدست آورید، و سپس دانش شما به‌مرور با کاوش در سایر بخش‌های مستندات افزایش خواهد یافت.

نمای کلی چرخه‌ی حیات

اولین چیزها

نقطه‌ی ورود تمام درخواست‌ها به یک اپلیکیشن Laravel فایل public/index.php است. تمام درخواست‌ها توسط فایل تنظیمات وب‌سرور شما (Apache یا Nginx) به این فایل هدایت می‌شوند. فایل index.php کد زیادی ندارد. درعوض، یک نقطه‌ی شروع برای بارگذاری مابقی فریمورک است.

فایل index.php بارگذار خودکار تولیدشده توسط کامپوزر را فراخوانی می‌کند، و سپس یک نمونه از اپلیکیشن لاراول را از اسکریپت bootstrap/app.php بازیابی می‌نماید. اولین کاری که توسط خود لاراول انجام می‌شود، ایجاد یک نموده از اپلیکیشن / ظرف سرویس است.

هسته‌های HTTP و کنسول

در مرحله‌ی بعد، بسته به نوع درخواستی که وارد برنامه می‌شود، درخواست یا به هسته‌ی HTTP و یا به هسته‌ی کنسول ارسال می‌گردد. این دو هسته بعنوان مکان مرکزی تمام درخواست‌هایی عمل می‌کنند که از آنها می‌گذرند. فعلاً اجازه‌دهید برروی هسته‌ی HTTP تمرکز داشته باشیم که در مسیر app/Http/Kernel.php قرار دارد.

هسته‌ی HTTP از کلاس IlluminateFoundationHttpKernel مشتق شده است که یک آرایه از راه‌اندازهای خودکار تعریف می‌کند که قبل‌از اجرای درخواست اجرا خواهند شد. این راه‌اندازهای خودکار، کنترل خطاها و گزارش‌گیری را تنظیم‌کرده و محیط برنامه را تشخیص می‌دهند و سایر وظایف موردنیاز برای اجرا را قبل‌از آنکه درخواست واقعاً پردازش شود، انجام می‌دهند.

هسته‌ی HTTP یک فهرست از میان‌افزارهای HTTP تعریف می‌کند که تمامی درخواست‌ها باید قبل‌از پردازش توسط برنامه، از درون آنها رد شوند. این میان‌افزارها عملیات خواندن و نوشتن نشست‌های HTTP، تشخیص اینکه آیا برنامه در وضعیت نگهداری است یا نه، بررسی توکن امنیتی CSRF و... را انجام می‌دهند.

امضای متد handle از هسته‌ی HTTP خیلی ساده است: یک Request دریافت کرده و یک Response برمی‌گرداند. هسته را یک جعبه‌ی سیاه بزرگ درنظر بگیرید که نمایانگر تمام برنامه‌ی شماست. آنرا با درخواست‌های HTTP تغذیه کنید تا به شما پاسخ‌های HTTP بازگرداند.

عرضه‌کنندگان سرویس

یکی‌از مهم‌ترین عملیات راه‌اندازی خودکار هسته، بارگذاری عرضه‌کنندگان سرویس برای برنامه‌ی شماست. همه‌ی عرضه‌کنندگان سرویس برای برنامه در آرایه‌ی providers درون فایل پیکربندی config/app.php تنظیم شده‌اند. ابتدا متد register برروی تمامی عرضه‌کنندگان فراخوانی می‌شود و سپس وقتی همه‌ی عرضه‌کنندگان ثبت شدند، متد boot فراخوانی خواهد شد.

عرضه‌کنندگان سرویس مسئول بارگذاری خودکار تمامی عناصر داخلی فریمورک نظیر پایگاه داده‌ها، صف، اعتبارسنجی و مسیریابی هستند. از آنجا که عرضه‌کنندگان سرویس هر قابلیتی را که توسط فریمورک ارائه شده است راه‌اندازی و تنظیم می‌کنند، مهم‌ترین جنبه‌ی تمامی فرایند راه‌اندازی خودکار لاراول محسوب می‌شوند.

اعزام درخواست

وقتی که برنامه راه‌اندازی خودکار شد و تمامی عرضه‌کنندگان سرویس ثبت شدند، Request به مسیریاب برای اعزام ارسال می‌شود. مسیریاب درخواست را به یک مسیر یا کنترلر می‌فرستد و هرگونه میان‌افزار مرتبط با مسیر را نیز اجرا خواهد کرد.

تمرکز برروی عرضه‌کنندگان سرویس

عرضه‌کنندگان سرویس حقیقتاً کلید راه‌اندازی خودکار یک اپلیکیشن Laravel هستند. شئ نمونه‌ی برنامه ایجاد شده، عرضه‌کنندگان سرویس ثبت می‌شوند و درخواست به برنامه‌ی راه‌اندازی‌شده ارسال می‌شود. واقعاً به همین سادگی است!

داشتن یک فهم استوار از چگونگی ساخت برنامه‌ی لاراول و نحوه‌ی راه‌اندازی اولیه‌ی آن ازطریق عرضه‌کنندگان سرویس بسیار ارزشمند است. عرضه‌کنندگان سرویس پیشفرض برنامه‌ی شما در مسیر app/Providers قرار دارند.

بطور پیشفرض، AppServiceProvider انصافاً خالی است. این عرضه‌کننده یک مکان عالی برای اضافه‌کردن راه‌اندازهای خودکار مخصوص برنامه‌ی شما و نسبت‌دادن ظرف سرویس آن است. برای برنامه‌های بزرگ، ممکن‌است بخواهید که عرضه‌کنندگان سرویس متعددی بسازید، که هرکدام نوع اختصاصی راه‌اندازی خاص خود را دارند.
نگهدارنده‌ی سرویس

مقدمه

نگهدارنده‌ی سرویس (Service Container) در لاراول یک ابزار قدرتمند برای مدیریت وابستگی‌های کلاس و انجام عملیات تزریق وابستگی (Dependency Injection). تزریق وابستگی یک عبارت جذاب است که اساساً به این معناست که: وابستگی‌های کلاس ازطریق سازنده یا در برخی موارد، متدهای نسبت‌دهنده (Setter) «تزریق می‌شوند».

به این مثال ساده دقت کنید:

<?php

namespace AppHttpControllers;

use AppUser;
use AppRepositoriesUserRepository;
use AppHttpControllersController;

class UserController extends Controller
{
   /**
    * The user repository implementation.
    *
    * @var UserRepository
    */
   protected $users;

   /**
    * Create a new controller instance.
    *
    * @param  UserRepository  $users
    * @return void
    */
   public function __construct(UserRepository $users)
   {
       $this->users = $users;
   }

   /**
    * Show the profile for the given user.
    *
    * @param  int  $id
    * @return Response
    */
   public function show($id)
   {
       $user = $this->users->find($id);

       return view('user.profile', ['user' => $user]);
   }
}

در این مثال UserController نیاز به استخراج کاربران از یک منبع داده‌ها دارد. بنابراین ما یک سرویس را تزریق می‌کنیم که قادر به استخراج کاربران است. UserRepository ما به احتمال زیاد از Eloquent برای استخراج اطلاعات کاربر از پایگاه داده‌ها استفاده می‌کند. هرچند از آنجا که مخزن تزریق شده است، ما قادر به جایگزینی راحت آن با یک پیاده‌سازی دیگر هستیم. همچنین می‌توانیم در زمان تست برنامه‌ی خود، به‌راحتی پیاده‌سازی UserRepository را جعل‌کنیم یا یک پیاده‌سازی ساختگی از آن ایجاد نماییم.

انتساب (Binding)

مفاهیم پایه‌ی انتساب

نسبت‌دهی تقریباً تمام نگهدارنده‌های سرویس شما در داخل عرضه‌کنندگان سرویس ثبت می‌شود، بنابراین اغلب این مثال‌ها نحوه‌ی استفاده از نگهدارنده را در آن حوزه نشان می‌دهند.

نقل قول:نکته: اگر کلاس‌های شما به هیچ رابطی (Interface) وابسته نیستند، لازم‌نیست آنها را به نگهدارنده نسبت‌دهید. نگهدارنده به هیچ دستورالعملی برای نحوه‌ی ایجاد این قبیل اشیاء نیاز ندارد، زیرا می‌تواند بطور خودکار این اشیاء را ازطریق انعکاس (Reflection) بیابد.

انتساب‌های ساده

همیشه درون یک عرضه‌کننده‌ی سرویس به نگهدارنده ازطریق خصوصیت $this->app دسترسی دارید. می‌توانیم یک انتساب را با کمک متد bind و ارسال اسم کلاس یا رابط موردنظر جهت ثبت‌کردن، درکنار یک بَستار (Closure) که آن رابط یا کلاس را باز می‌گرداند، ثبت کنیم:

$this->app->bind('HelpSpotAPI', function ($app) {
   return new HelpSpotAPI($app->make('HttpClient'));
});

دقت‌کنید که ما خود نگهدارنده را بعنوان یک آرگومان در تابع Closure که وظیفه‌ی پیداکردن کلاس یا رابط را دارد (Resolver) دریافت می‌کنیم و سپس می‌توانیم از نگهدارنده برای یافتن وابستگی‌های زیرمجموعه‌ی کلاس یا رابطی که قصد ایجاد شئ از آن داریم، استفاده کنیم.

انتساب یک Singleton

متد singleton یک کلاس یا رابط را به نگهدارنده به‌نحوی اضافه می‌کند که فقط یکبار یافته و ایجاد شود. زمانی‌که یک انتساب singleton یافت شد، فراخوانی‌های بعدی آن در نگهدارنده همان شئ قبلی را باز می‌گرداند:

$this->app->singleton('HelpSpotAPI', function ($app) {
   return new HelpSpotAPI($app->make('HttpClient'));
});

انتساب اشیاء نمونه

می‌توانید یک شئ از قبل موجود را نیز به نگهدارنده با کمک متد instance نسبت‌دهید. نمونه‌ی ارائه‌شده همیشه در فراخوانی‌های بعدی به نگهدارنده بازگردانده می‌شود:

$api = new HelpSpotAPI(new HttpClient);

$this->app->instance('HelpSpotAPI', $api);

انتساب مقادیر اولیه

گاهی اوقات ممکن‌است نیاز به کلاسی داشته باشید که برخی کلاس‌های تزریق‌شده را دریافت می‌کند، اما علاوه‌بر آن، یک مقدار اولیه‌ی تزریق‌شده نظیر یک عدد صحیح را هم نیاز دارد. می‌توانید به‌سادگی از انتساب محتوایی برای تزریق هر مقداری به کلاسی که ممکن‌است نیاز داشته باشید، استفاده کنید:

$this->app->when('AppHttpControllersUserController')
         ->needs('$variableName')
         ->give($value);

انتساب رابط‌ها به پیاده‌سازی (Implementation)

یک قابلیت بسیار قدرتمند نگهدارنده‌ی سرویس، توانایی آن در انتساب یک رابط به یک پیاده‌سازی است. برای مثال، اجازه‌دهید فرض کنیم که یک رابط EventPusher داریم و یک کلاس به‌نام ReditEventPusher که آنرا پیاده‌سازی کرده است. زمانی که کد کلاس ReditEventPusher خود را نوشتیم، می‌توانیم آنرا در نگهدارنده به‌صورت زیر اضافه کنیم:

$this->app->bind(
   'AppContractsEventPusher',
   'AppServicesRedisEventPusher'
);

این دستور به نگهدارنده می‌گوید که باید کلاس RedisEventPusher را هرگاه که نیاز به یک پیاده‌سازی از رابط EventPusher وجود داشت، تزریق‌کند. اکنون می‌توانیم از راهنمای نوع رابط EventPusher در سازنده یا هر مکان دیگر که وابستگی‌ها توسط نگهدارنده‌ی سرویس تزریق می‌شوند، استفاده کنیم:

use AppContractsEventPusher;

/**
* Create a new class instance.
*
* @param  EventPusher  $pusher
* @return void
*/
public function __construct(EventPusher $pusher)
{
   $this->pusher = $pusher;
}

انتساب محتوایی

برخی اوقات ممکن‌است دو کلاس که از یک رابط یکسان استفاده می‌کنند داشته‌باشید ولی بخواهید که پیاده‌سازی‌های متفاوتی را در هر کلاس تزریق کنید. برای مثال دو کنترلر ممکن‌است وابسته به پیاده‌سازی‌های مختلفی از قرارداد IlluminateContractsFilesystemFileststem باشند. لاراول یک راهکار روان و ساده برای تعریف این رفتار ارائه می‌کند:

use IlluminateSupportFacadesStorage;
use AppHttpControllersPhotoController;
use AppHttpControllersVideoController;
use IlluminateContractsFilesystemFilesystem;

$this->app->when(PhotoController::class)
         ->needs(Filesystem::class)
         ->give(function () {
             return Storage::disk('local');
         });

$this->app->when([VideoController::class, UploadController::class])
         ->needs(Filesystem::class)
         ->give(function () {
             return Storage::disk('s3');
         });

شناسه‌گذاری

در موقعیت‌های خاصی احتمال دارد که نیاز به یافتن تمامی انواع یک «دسته‌بندی» خاص از انتساب‌ها باشید. برای مثال شاید مشغول ساخت یک گزارش تجمیع هستید که آرایه‌ای از انواع مختلف پیاده‌سازی‌های رابط Report را دریافت می‌کند. پس‌از ثبت پیاده‌سازی‌های Report می‌توانید به آنها یک شناسه با کمک متد tag بدهید:

$this->app->bind('SpeedReport', function () {
   //
});

$this->app->bind('MemoryReport', function () {
   //
});

$this->app->tag(['SpeedReport', 'MemoryReport'], 'reports');

وقتی که سرویس‌ها شناسه‌گذاری شدند، می‌توانید به‌راحتی آنها را ازطریق متد tagged بیابید:

$this->app->bind('ReportAggregator', function ($app) {
   return new ReportAggregator($app->tagged('reports'));
});

گسترش انتساب‌ها

متد extend اجازه‌ی ویرایش سرویس‌های یافته‌شده را می‌دهد. برای مثال وقتی‌که یک سرویس یافت شد، می‌توانید یک کد اضافه اجرا کنید تا سرویس را تزئین یا تنظیم کند. متد extend یک بَستار (Closure) را بعنوان تنها پارامتر خود دریافت می‌کند که باید سرویس ویرایش‌شده را بعنوان نتیجه بازگرداند:

$this->app->extend(Service::class, function ($service) {
    return new DecoratedService($service);
});

یافتن

متد make

می‌توانید از متد make برای یافتن یک نمونه از یک کلاس در خارج از نگهدارنده استفاده کنید. متد make اسم کلاس یا رابطی را که نیاز دارید بیابید، بعنوان پارامتر دریافت می‌کند:

$api = $this->app->make('HelpSpotAPI');

اگر در بخشی از کدتان هستید که به متغیر $app دسترسی ندارید، می‌توانید از متد کمکی resolve استفاده کنید:

$api = resolve('HelpSpotAPI');

اگر برخی از وابستگی‌های کلاس‌های شما ازطریق نگهدارنده‌ی سرویس قابل یافتن نیستند، می‌توانید آنها را با ارسال به‌صورت یک آرایه‌ی انجمنی برای متد makeWith تزریق کنید:

$api = $this->app->makeWith('HelpSpotAPI', ['id' => 1]);

تزریق خودکار

بعنوان یک راهکار جایگزین (و مهم) این امکان وجود دارد که نوع وابستگی را بعنوان راهنمای نوع (Type-Hint) در سازنده یا کلاسی که توسط نگهدارنده یافته می‌شود قید کنید و این موضوع شامل کنترلرها، شنونده‌های رویداد، کارهای صف‌بندی‌شده، میان‌افزارها و... می‌شود. در زمان تمرین، این روشی است که اغلب اشیاء شما باید توسط نگهدارنده یافته‌شوند.

برای مثال، ممکن‌است با راهنمای نوع، یک مخزن را که در برنامه‌ی شما در سازنده‌ی یک کنترلر معرفی شده است، مشخص کنید. مخزن بطور خودکار پیدا شده و به درون کلاس تزریق خواهد شد:

<?php

namespace AppHttpControllers;

use AppUsersRepository as UserRepository;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * Show the user with the given ID.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }
}

رویدادهای نگهدارنده

نگهدارنده‌ی سرویس یک رویداد را هر بار که یک شئ را می‌یابد، فراخوانی می‌کند. می‌توانید به این رویداد توسط متد resolving گوش کنید:

$this->app->resolving(function ($object, $app) {
    // Called when container resolves object of any type...
});

$this->app->resolving(HelpSpotAPI::class, function ($api, $app) {
    // Called when container resolves objects of type "HelpSpotAPI"...
});

همانطور که ملاحظه می‌کنید، شئ یافته‌شده بعنوان پارامتر به متد Closure ارسال می‌گردد که به شما اجازه‌ی تنظیم هرگونه خصوصیت‌های اضافه را برروی شئ قبل‌از ارسال آن برای مصرف‌کننده، می‌دهد.

استاندارد PSR-11

نگهدارنده‌ی سرویس Laravel استاندارد رابط PSR-11 را پیاده‌سازی می‌کند. بنابراین می‌توانید از راهنمای نوع رابط نگهدارنده‌ی PSR-11 برای دریافت یک شئ نگهدارنده‌ی لاراول استفاده کنید:

use PsrContainerContainerInterface;

Route::get('/', function (ContainerInterface $container) {
    $service = $container->get('Service');

    //
});

اگر شناسه‌ی موردنظر قابل یافتن نباشد، یک استثنا تولید می‌شود. اگر شناسه هرگز نسبت داده نشده باشد، این استثنا از نوع PsrContainerNotFoundExceptionInterface خواهد بود. اگر شناسه نسبت‌داده شده باشد ولی قابل یافتن نباشد، یک نمونه از PsrContainerContainerExceptionInterface پرتاب (Throw) خواهد شد.