بعبارة أخرى ، يشبه مقدمو الخدمة مسارًا نسكب من خلاله وقود "صنف" في خزان يسمى "حاوية الخدمة" لمحرك يسمى Laravel.
إذا فتحنا config / app.php ، فسنرى مصفوفة باسم "Provider"
'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,
.
.
.
],
هؤلاء هم بعض مقدمي الخدمات المقدمين مع Laravel ، أي الخدمات الأساسية التي يتم وضعها في حاوية الخدمة.
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
مضمن في Laravel ، فهل كل الموجودين في المجلد app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
كلهم عبارة عن صفوف PHP ، كل منها مرتبط بموضوعه الخاص: App
, Auth
, Broadcasting
, Events
e Routes
. لكنهم جميعًا لديهم شيء واحد مشترك: الطريقة boot()
.
داخل هذه الطريقة ، يمكننا كتابة أي كود متعلق بأي من هذه الأقسام: auth
, events
, route
، إلخ. بمعنى آخر ، مقدمو الخدمة هم مجرد فئات لتسجيل بعض الوظائف العالمية.
إنهم منفصلون باسم "موفرو الخدمات" لأنهم يعملون في وقت مبكر جدًا من دورة حياة التطبيق ، لذا فإن شيئًا عالميًا يكون مناسبًا هنا قبل أن يصل البرنامج النصي المنفذ إلى النماذج أو وحدات التحكم.
معظم الوظائف موجودة في 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
للجميع 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
.
مثال نموذجي إلى حد ما هو تكوين العرض 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 هو متغير عالمي في Laravel يمكن لفئة فردية الوصول إليه من خلال التطبيق.
Singleton هي ميزة. عند تطبيق هذه الميزة ، نبلغ التطبيق أنه يجب أن يكون لأي فئة يتم تمريرها كمعامل في التطبيق مثيل واحد فقط في التطبيق بأكمله. هذا يعني أنه سيتم حل MyClass مرة واحدة وسيكون له مثيل واحد فقط ، والذي يمكن الوصول إليه باستخدام متغير my_class.
تسمح لك طريقة التمهيد () بالوصول إلى جميع الخدمات المسجلة مسبقًا باستخدام طريقة التسجيل. يمكنك بعد ذلك تضمين الخدمة بالكامل في تطبيقك باستخدام هذه الطريقة.
بالعودة إلى المثال السابق ، دعنا نزيل الطريقة 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
، ها هو المقتطف من موقع Laravel الرسمي :
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
قد تكون مهتمة أيضًا بـ:
يعد القطاع البحري قوة اقتصادية عالمية حقيقية، وقد اتجه نحو سوق يبلغ حجمه 150 مليارًا...
أعلنت صحيفة فاينانشيال تايمز يوم الاثنين الماضي عن صفقة مع OpenAI. "فاينانشيال تايمز" ترخص صحافتها ذات المستوى العالمي...
يدفع الملايين من الأشخاص مقابل خدمات البث، ويدفعون رسوم الاشتراك الشهرية. من الشائع أنك…
سوف تستمر شركة Coveware by Veeam في تقديم خدمات الاستجابة لحوادث الابتزاز السيبراني. ستوفر Coveware إمكانات الطب الشرعي والمعالجة...