مقالات

ارائه دهندگان خدمات در لاراول: چه هستند و چگونه از ارائه دهندگان خدمات در لاراول استفاده کنیم

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

به عبارت دیگر، ارائه دهندگان خدمات مانند قیفی هستند که از طریق آن سوخت «کلاس» را در مخزنی به نام «کانتینر سرویس» موتوری به نام لاراول می‌ریزیم.

مثال

اگر 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,
        .
        .
        .
],

اینها برخی از ارائه دهندگان خدماتی هستند که همراه با لاراول ارائه می شوند، یعنی خدمات اساسی که در کانتینر سرویس قرار می گیرند.

Quando من 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'.
  • در نهایت، پس از پردازش تمام ارائه دهندگان خدمات، لاراول به تجزیه مسیر (مسیر)، اجرای کنترلر، استفاده از قالب ها و غیره می رود.

ارائه دهندگان خدمات لاراول قبلdefiنیتی

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

متد 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

متد ()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

شما همچنین ممکن است علاقه مند باشید:

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

مقالات اخیر

پرداخت های آنلاین: در اینجا نحوه پرداخت خدمات جریانی شما را برای همیشه توضیح می دهد

میلیون‌ها نفر برای خدمات استریم پرداخت می‌کنند و هزینه اشتراک ماهانه می‌پردازند. این عقیده رایج است که شما…

آوریل 29 2024

Veeam دارای جامع ترین پشتیبانی از باج افزار، از محافظت تا پاسخ و بازیابی است

Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیت‌های پزشکی قانونی و اصلاحی را ارائه می‌دهد…

آوریل 23 2024

انقلاب سبز و دیجیتال: چگونه تعمیر و نگهداری پیش‌بینی‌کننده صنعت نفت و گاز را متحول می‌کند

تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…

آوریل 22 2024

تنظیم کننده ضد انحصار بریتانیا هشدار BigTech را در مورد GenAI به صدا در می آورد

CMA انگلستان در مورد رفتار Big Tech در بازار هوش مصنوعی هشداری صادر کرده است. آنجا…

آوریل 18 2024

نوآوری را به زبان خود بخوانید

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

ما را دنبال کنید