به عبارت دیگر، ارائه دهندگان خدمات مانند قیفی هستند که از طریق آن سوخت «کلاس» را در مخزنی به نام «کانتینر سرویس» موتوری به نام لاراول میریزیم.
اگر config/app.php را باز کنیم، آرایهای با نام «ارائهدهنده» میبینیم.
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
.
.
.
],
اینها برخی از ارائه دهندگان خدماتی هستند که همراه با لاراول ارائه می شوند، یعنی خدمات اساسی که در کانتینر سرویس قرار می گیرند.
service provider
اجرا می شوند؟اگر به مستندات نگاه کنیم بر اساس درخواست چرخه عمر ، فایل های زیر در ابتدا اجرا می شوند:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
و او Middlewares
Service Providers
: محتوای این مقالهواجد شرایط service provider
آیا آنها بارگیری می شوند؟
آنها هستند definites در آرایه config/app.php
:
return [
// ... other configuration values
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
// ... other framework providers from /vendor
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* PUBLIC Service Providers - the ones we mentioned above
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
];
همانطور که می بینیم، لیستی از وجود دارد service provider
عمومی در پوشه نیست /vendor
، ما نه باید آنها را لمس کنیم و نه اصلاح کنیم. کسانی که به ما علاقه مند هستند در زیر، با BroadcastServicerProvider
به طور پیش فرض غیرفعال شده است، احتمالاً به این دلیل که به ندرت استفاده می شود.
همه این ارائه دهندگان خدمات از بالا به پایین اجرا می شوند و لیست را تکرار می کنند دو برابر:
register()
، برای (در نهایت) اجرای چیزی که قبل از متد پیکربندی شده است مفید است boot()
.boot()
از همه ارائه دهندگان دوباره، یکی یکی، از بالا به پایین، آرایه 'providers'
.I Service Providers
در لاراول گنجانده شده است، همه کسانی که در پوشه وجود دارند app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
همه آنها کلاس های PHP هستند که هر کدام به موضوع خود مربوط می شوند: App
, Auth
, Broadcasting
, Events
e Routes
. اما همه آنها یک چیز مشترک دارند: روش boot()
.
در داخل آن متد، میتوانیم هر کد مربوط به هر یک از آن بخشها را بنویسیم: auth
, events
, route
، و غیره. به عبارت دیگر، ارائه دهندگان خدمات فقط کلاس هایی برای ثبت برخی عملکردهای جهانی هستند.
آنها به عنوان "ارائه دهندگان" مجزا هستند زیرا در اوایل چرخه عمر برنامه اجرا می شوند، بنابراین قبل از اینکه اسکریپت اجرایی به Models یا Controller برسد، چیزی جهانی در اینجا راحت است.
بیشتر عملکردها در RouteServiceProvider است، کد زیر است:
class RouteServiceProvider extends ServiceProvider
{
public const HOME = '/dashboard';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}
این کلاسی است که فایل ها در آن پیکربندی می شوند route
با routes/web.php
e routes/api.php
به طور پیش فرض گنجانده شده استdefiنیتا توجه داشته باشید که برای API نیز تنظیمات مختلفی وجود دارد: پیشوند نقطه پایانی /api
و میان افزار api
برای همه routes
.
ما می توانیم ویرایش کنیم service providers
، که در پوشه نیستند /vendor
. سفارشی سازی این فایل ها زمانی انجام می شود که شما مسیرهای زیادی دارید و می خواهید آنها را به فایل های خاصی جدا کنید. شما ایجاد می کنید routes/auth.php
و مسیرها را در آنجا قرار دهید، سپس آن فایل را در متد "فعال کنید". boot()
di RouteServiceProvider
، فقط جمله سوم را اضافه کنید:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
خالی است یک مثال معمولی از اضافه کردن کد AppServiceProvider
، در مورد غیرفعال کردن بارگذاری تنبل در Eloquent است. برای انجام این کار، شما فقط نیاز دارید دو خط اضافه کنید در روش boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
اگر یک مدل رابطه بارگذاری نشود، این یک استثنا ایجاد می کند.
service provider
سفارشیعلاوه بر فایل های پیشdefinites، ما به راحتی می توانیم یک مورد جدید ایجاد کنیم Service Provider
، مربوط به موضوعات دیگری غیر از موضوعات قبلی استdefiبه عنوان به پایان رسید auth
/event
/routes
.
یک مثال نسبتاً معمولی پیکربندی view است Blade
. ما می توانیم یک بخشنامه ایجاد کنیم Blade
و سپس آن کد را به متد اضافه کنید boot(
) از هر service provider
، از جمله پیش فرض AppServiceProvider
. بیایید اکنون یک را ایجاد کنیم ViewServiceProvider
جداگانه، مجزا.
با این دستور می توانیم آن را تولید کنیم:
php artisan make:provider ViewServiceProvider
که کلاس را خیلی پیش تولید می کندdefiنیت:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
همانطور که در داخل می بینیم دو روش وجود دارد:
متد register() به ما این امکان را می دهد defiپیوندهای nish به ظرف خدمات ما. به عنوان مثال در کد زیر:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app یک متغیر سراسری در لاراول است که یک کلاس singleton می تواند از طریق برنامه به آن دسترسی داشته باشد.
Singleton یک ویژگی است. هنگام اعمال این ویژگی، به برنامه اطلاع می دهیم که هر کلاسی که به عنوان پارامتر در برنامه ارسال می شود باید فقط یک نمونه در کل برنامه داشته باشد. این بدان معنی است که MyClass یک بار حل می شود و تنها یک نمونه خواهد داشت که با استفاده از متغیر my_class قابل دسترسی است.
متد ()boot به شما امکان می دهد به تمام سرویس هایی که قبلاً با استفاده از روش ثبت ثبت شده اند دسترسی داشته باشید. سپس با استفاده از این روش می توانید کل سرویس را در برنامه خود قرار دهید.
با بازگشت به مثال قبلی، روش را حذف می کنیم register()
و در داخل boot()
کد دستورالعمل Blade را اضافه کنید:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
نمونه دیگری از ViewServiceProvider
آن مربوط می شود View Composers
، این قطعه است از سایت رسمی لاراول :
use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function boot()
{
// Using class based composers...
View::composer('profile', ProfileComposer::class);
// Using closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
}
برای اجرا، این ارائهدهنده جدید باید به آرایه ارائهدهنده اضافه یا ثبت شود config/app.php
:
return [
// ... other configuration values
'providers' => [
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
// Add your provider here
App\Providers\ViewServiceProvider::class,
],
];
Ercole Palmeri
شما همچنین ممکن است علاقه مند باشید:
میلیونها نفر برای خدمات استریم پرداخت میکنند و هزینه اشتراک ماهانه میپردازند. این عقیده رایج است که شما…
Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیتهای پزشکی قانونی و اصلاحی را ارائه میدهد…
تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…
CMA انگلستان در مورد رفتار Big Tech در بازار هوش مصنوعی هشداری صادر کرده است. آنجا…