سلام! این موضوع که توی مصاحبهها از لاراول چی میپرسن و ما باید چی جواب بدیم همیشه برای من سوال بوده. اگر شما هم با من هم دغدغه این پس این سری مقاله رو دنبال کنید چون قراره ۶۵ تا سوال متداول رو که شرکتهای بینالمللی از کارجوهاشون میپرسن رو اینجا بگیم و جوابشون رو هم بذاریم. منبع اصلی این سری مقاله اینجا است. اگر جواب سوالات رو بدونیم که خوشحال میشیم و برامون مرور میشه و اگر ندونیم هم جوابش رو یاد میگیریم. دیگه سرتون رو در نمیارم و میرم سراغ سوالات. آها قراره این سوالات رو توی سه تا مقاله بیارم که لیستشون رو این زیر میذارم و به مرور لینکاشون رو آپدیت میکنم:
- سوالات ۱-۲۲ که میشه همین مقاله 😁
- سوالات ۲۳-۴۴
- سوالات ۴۵-۶۵
۱. Laravel چیست؟
لاراول یک فریمورک وب متن باز برای PHP است که برای توسعهی وب اپلیکیشنها ساخته شده است و از معماری MVC پیروی میکند.
2. Laravel Horizon چیست؟
Laravel Horizon یک داشبورد زیبا برای صفهای روی Redis ارائه میدهد که در آن میتوانید جابها رو مانیتور کنید. همچنین تمام تنظیمات workerهای صف horizon، در یک فایل قرار دارد که اسکیل کردن پروژه را بسیار راحت میکند.
۳. Laravel Dusk چیست؟
Laravel Dusk یک API رسا و ساده برای خودکار سازی تستهای مربوط به مرورگر در اختیار ما میگذارد.
۴. Laravel Echo چیست؟
این پکیج برودکست کردن ایونتها (Event Broadcasting) را در یک اپلیکیشن لاراولی ساده میکند و قدرت WebSockets را بدون پیچیدگی به اپلیکیشن لاراولی اضافه میکند.
۵. شما لاراول را چگونه نصب میکنید؟
برای استفاده از لاراول ابتدا باید از نصب بودن composer روی سیستممان مطمئن باشیم. لاراول برای مدیریت پکیجها و وابستگیهای خود از composer استفاده میکند و خود توسط composer نصب میشود.
۶. Composer چیست؟
Composer یک ابزار مدیریت وابستگی در PHP است. کامپوزر این امکان را به ما میدهد تا پکیجهایی که پروژهی ما به آنها وابسته است را مشخص کنیم و وظیفهی نصب یا بهروزرسانی آنها را کامپوزر به عهده میگیرد.
۷. Service Container در لاراول چیست؟
سرویس کانتینر لاراول یک ابزار قدرتمند برای مدیریت وابستگیهای کلاسها است و عملیات dependency injection (از این به بعد میگم تزریق وابستگی) را برای ما انجام میدهد. تزریق وابستگی یعنی وابستگیهای کلاس از طریق constructor یا در برخی شرایط با متدهای setter به کلاس تزریق میشوند.
۸. Binding چیست؟
در یک سرویس پرووایدر (Service provider) ما همیشه به کانتینر دسترسی داریم. ما میتوانیم یک binding را با متد bind رجیستر کنیم. برای این کار باید نام کلاس یا اینترفیس (interface) ای که میخواهیم bind کنیم را به همراه یک Closure که یک شیء از آن کلاس را برگرداند به متد bind بدهیم.
$this->app->bind('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
۹. Bind کردن یک singleton را توضیح دهید.
درون یک سرویس پرووایدر ما میتوانیم یک اینترفیس را به گونهای bind کنیم که تنهای یک مرتبه resolve شود. به عبارت دیگر، یک بار که اینترفیس resolve و یک شیء از آن ایجاد شد، در درخواستهای بعدی کانتینر همین شیء را برمیگرداند و شیء جدیدی ساخته نمیشود.
۱۰. Bind کردن یک شیء (instance) را توضیح دهید.
در لاراول این قابلیت که شما یک شیء موجود را به یک اینترفیس باید کنید هم وجود دارد. در این صورت در درخواستهای بعدی کانتینر همین شیء را برمیگرداند.
$api = new HelpSpot\API(new HttpClient);
$this->app->instance('HelpSpot\API', $api);
۱۱. Bind کردن primitive ها را توضیح دهید.
گاهی اوقات شما یک کلاس دارید که نه تنها نیاز دارد برخی وابستگیها از نوع کلاس به آن تزریق شوند، بلکه به یک مقدار primitive (مثل عدد، رشته یا آرایه) هم نیاز دارند. برای این کار شما میتوانید از contextual binding استفاده کنید. این کار با تکه کدی مانند مثال زیر در سرویس پرووایدر انجام میشود:
$this->app->when('App\Http\Controllers\UserController')
->needs('$variableName')
->give($value);
۱۲. Contextual binding را توضیح دهید و نحوهی کارکرد آن را شرح دهید.
گاهی اوقات شما دو کلاس دارید که به یک اینترفیس مشترک وابستگی دارند، اما میخواهید implementation یا پیادهسازی متفاوتی از این اینترفیس به هرکدام از این کلاسها تزریق شود. برای مثال دو کنترلر ممکن است به پیادهسازیهای مختلفی از اینترفیس Illuminate\Contracts\Filesystem\Filesystem نیاز داشته باشند. لاراول یک راه ساده و روان برای این رفتار در اختیار ما گذاشته است. کد زیر مثالی از این رفتار است:
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\PhotoController;
use App\Http\Controllers\VideoController;
use Illuminate\Contracts\Filesystem\Filesystem;
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(function () {
return Storage::disk('local');
});
$this->app->when(VideoController::class)
->needs(Filesystem::class)
->give(function () {
return Storage::disk('s3');
});
۱۳. تگ کردن (tagging) در لاراول چیست؟
در مواردی شما نیاز دارید تا یک دسته از binding ها را resolve کنید. برای مثال شما دارید یک تجمیعکنندهی گزارشات میسازید که یک آرایه از تعداد زیادی از پیادهسازیهای مختلف اینترفیس Report را دریافت میکند. پس از رجیستر کردن پیادهسازیهای Report شما میتوانید با متد tag به آنها یک تگ اختصاص دهید:
$this->app->bind('SpeedReport', function () {
//
});
$this->app->bind('MemoryReport', function () {
//
});
$this->app->tag(['SpeedReport', 'MemoryReport'], 'reports');
وقتی که به این سرویسها تگ زدید، میتوانید به راحتی آنها را با متد tagged از کانتینر resolve کنید:
$this->app->bind('ReportAggregator', function ($app) {
return new ReportAggregator($app->tagged('reports'));
});
۱۴. Extending Bindings یا بایندیگهای گسترشدهنده را توضیح دهید.
متد extend کانتینر این اجازه را میدهد که سرویسهای resolve شده را اصلاح یا دستکاری کنیم. برای مثال وقتی که یک سرویس resolve شده است، شما میتوانید کد بیشتری را اجرا کنید تا آن سرویس را decorate کنید یا اینکه تنظیمات خاصی را روی آن انجام دهید. به شکل زیر میتوانید از این قابلیت استفاده کنید:
$this->app->extend(Service::class, function($service) {
return new DecoratedService($service);
});
۱۵. متد make چه کار میکند؟
شما میتوانید از این متد برای resolve کردن یک شیء از یک کلاس استفاده کنید. این متد نام کلاس یا اینترفیسی که شما یک شیء از آن میخواهید را به عنوان ورودی دریافت میکند:
$api = $this->app->make('HelpSpot\API');
۱۶. سرویس پرووایدر (Service provider) چیست؟
سرویس پرووایدرها مکان مرکزی راهاندازی تمام اپلیکیشنهای لاراولی اند. اپلیکیشن شما، همانند سرویسهای هستهی لاراول توسط سرویس پرووایدرها راهاندازی میشوند.
۱۷. متد register چه کار میکند؟
در متد register شما باید فقط چیزها را به هم bind کنید. هرگز نباید رجیستر کردن event و listener ها، route ها یا هیچ عملکرد دیگری را درون متد register انجام دهید.
۱۸. فیلدهای bindings و singletons را شرح دهید.
اگر سرویس پرووایدر شما تعداد زیادی binding ساده را رجیستر میکند، بهتر است یه جای رجیستر کردن هر کدام از آنها به صورت جدا، از فیلدهای bindings و singletons استفاده کنید. وقتی که سرویس پرووایدر توسط فریمورک ساخته میشود به صورت خودکار موارد داخل این فیلدها را رجیستر میکند و شما از طریق سرویس کانتینر به آنها دسترسی دارید.
۱۹. متد boot چه کار میکند؟
برای مثال اگر ما بخواهیم یک view composer را در سرویس پرووایدر رجیستر کنیم، میبایست این کار را در متد boot انجام دهیم. این متد پس از اینکه تمام سرویس پرووایدرها رجیستر شدهاند صدا زده میشود. در نتیجه درون این متد شما به تمام سرویسهایی که توسط فریمورک رجیستر شدهاند دسترسی دارید.
۲۰. سرویس پرووایدرها را در کجا رجیستر میکنید؟
تمام سرویس پرووایدرها درون فایل پیکربندی config/app.php رجیستر میشوند. این فایل یک آرایه با نام providers دارد و شما باید نام کلاس سرویس پرووایدرهای خود را درون آن بنویسید.
۲۱. سرویس پرووایدرها را چگونه رجیستر میکنید؟
برای رجیستر کردن پرووایدر خود، کافی است نام کلاس آن را به آرایهی providers اضافه کنید:
'providers' => [
// Other Service Providers
App\Providers\ComposerServiceProvider::class,
],
۲۲. Facade چیست؟
Facade ها یک رابط استاتیک به کلاسهایی که در سرویس کانتینر اپلیکیشن در دسترس اند را در اختیار ما قرار می دهد.
خب توی این قسمت ۲۲ تا از سوالا رو پوشش دادیم و قسمت بعدی رو از اینجا میتونید ببینید. تا اینجا اگر نظری، سوالی یا پیشنهادی داشتید خیلی خوشحال میشم که در بخش نظرات بنویسید.