บทความ

ผู้ให้บริการใน Laravel: คืออะไรและจะใช้ผู้ให้บริการใน 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 พวกเขาโหลด? 

พวกเขาคือพวกนั้น defiไนท์ในอาร์เรย์ 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 ก่อนdefiniti

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 และมิดเดิลแวร์ 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 ที่กำหนดเอง

นอกจากไฟล์พรีแล้วdefiไม่เป็นไร เราสามารถสร้างใหม่ได้ง่ายๆ 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()

register() วิธีการช่วยให้เราสามารถ defiลิงก์เฉพาะไปยังคอนเทนเนอร์บริการของเรา ตัวอย่างเช่น ในรหัสต่อไปนี้:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app เป็นตัวแปรส่วนกลางใน laravel ที่คลาส 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นี่คือตัวอย่าง จากเว็บไซต์อย่างเป็นทางการของ 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

คุณอาจสนใจ:

จดหมายข่าวนวัตกรรม
อย่าพลาดข่าวสารที่สำคัญที่สุดเกี่ยวกับนวัตกรรม ลงทะเบียนเพื่อรับพวกเขาทางอีเมล

บทความล่าสุด

ผู้จัดพิมพ์และ OpenAI ลงนามข้อตกลงเพื่อควบคุมการไหลของข้อมูลที่ประมวลผลโดยปัญญาประดิษฐ์

เมื่อวันจันทร์ที่แล้ว Financial Times ได้ประกาศข้อตกลงกับ OpenAI FT อนุญาติให้ทำข่าวระดับโลก...

30 2024 เมษายน

การชำระเงินออนไลน์: นี่คือวิธีที่บริการสตรีมมิ่งทำให้คุณชำระเงินตลอดไป

ผู้คนนับล้านชำระค่าบริการสตรีมมิ่ง โดยจ่ายค่าธรรมเนียมการสมัครสมาชิกรายเดือน เป็นความเห็นทั่วไปที่คุณ...

29 2024 เมษายน

Veeam มีการสนับสนุนแรนซัมแวร์ที่ครอบคลุมที่สุด ตั้งแต่การป้องกันไปจนถึงการตอบสนองและการกู้คืน

Coveware by Veeam จะยังคงให้บริการตอบสนองต่อเหตุการณ์การขู่กรรโชกทางไซเบอร์ต่อไป Coveware จะนำเสนอความสามารถในการนิติเวชและการแก้ไข...

23 2024 เมษายน

การปฏิวัติสีเขียวและดิจิทัล: การบำรุงรักษาเชิงคาดการณ์กำลังเปลี่ยนแปลงอุตสาหกรรมน้ำมันและก๊าซอย่างไร

การบำรุงรักษาเชิงคาดการณ์กำลังปฏิวัติภาคส่วนน้ำมันและก๊าซ ด้วยแนวทางเชิงรุกและนวัตกรรมในการจัดการโรงงาน...

22 2024 เมษายน

อ่านนวัตกรรมในภาษาของคุณ

จดหมายข่าวนวัตกรรม
อย่าพลาดข่าวสารที่สำคัญที่สุดเกี่ยวกับนวัตกรรม ลงทะเบียนเพื่อรับพวกเขาทางอีเมล

ติดตามเรา