بضائع

مقدمو الخدمات في Laravel: ما هم وكيفية استخدام مزودي الخدمة في Laravel

مقدمو خدمات Laravel هم المكان المركزي الذي يتم فيه إطلاق التطبيق. أي يتم دفع الخدمات الأساسية وخدمات التطبيق والفئات وتبعياتها إلى حاوية الخدمة عبر مقدمي الخدمات. 

بعبارة أخرى ، يشبه مقدمو الخدمة مسارًا نسكب من خلاله وقود "صنف" في خزان يسمى "حاوية الخدمة" لمحرك يسمى 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'.
  • أخيرًا ، بعد معالجة جميع مزودي الخدمة ، ينتقل Laravel إلى تحليل المسار (المسار) ، وتشغيل وحدة التحكم ، واستخدام القوالب ، وما إلى ذلك.

مقدمو خدمات Laravel مسبقًاdefiنيتي

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.phproutes/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

قد تكون مهتمة أيضًا بـ:

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

المقالات الأخيرة

المدفوعات عبر الإنترنت: إليك كيف تجعلك خدمات البث تدفع إلى الأبد

يدفع الملايين من الأشخاص مقابل خدمات البث، ويدفعون رسوم الاشتراك الشهرية. من الشائع أنك…

أبريل 29 2024

يتميز Veeam بالدعم الأكثر شمولاً لبرامج الفدية، بدءًا من الحماية وحتى الاستجابة والاسترداد

سوف تستمر شركة Coveware by Veeam في تقديم خدمات الاستجابة لحوادث الابتزاز السيبراني. ستوفر Coveware إمكانات الطب الشرعي والمعالجة...

أبريل 23 2024

الثورة الخضراء والرقمية: كيف تعمل الصيانة التنبؤية على تغيير صناعة النفط والغاز

تُحدث الصيانة التنبؤية ثورة في قطاع النفط والغاز، من خلال اتباع نهج مبتكر واستباقي لإدارة المحطات.

أبريل 22 2024

منظم مكافحة الاحتكار في المملكة المتحدة يثير إنذار BigTech بشأن GenAI

أصدرت هيئة أسواق المال في المملكة المتحدة تحذيرًا بشأن سلوك شركات التكنولوجيا الكبرى في سوق الذكاء الاصطناعي. هناك…

أبريل 18 2024

اقرأ الابتكار بلغتك

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

تابعنا