artikel

Pembekal Perkhidmatan dalam Laravel: apakah itu dan cara menggunakan Pembekal Perkhidmatan dalam Laravel

Pembekal perkhidmatan Laravel ialah tempat utama di mana aplikasi dimulakan. Iaitu, perkhidmatan teras Laravel dan perkhidmatan aplikasi, kelas, dan kebergantungan mereka diletakkan dalam bekas perkhidmatan melalui pembekal. 

Dalam erti kata lain, pembekal perkhidmatan adalah seperti corong yang melaluinya kami menuangkan bahan api "kelas" ke dalam tangki yang dipanggil "bekas servis" enjin yang dipanggil Laravel.

contoh

Jika kita membuka config/app.php kita akan melihat tatasusunan dengan nama "penyedia"

'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,
        .
        .
        .
],

Ini adalah beberapa pembekal perkhidmatan yang disediakan bersama-sama dengan laravel, iaitu perkhidmatan asas yang diletakkan di dalam bekas perkhidmatan.

Bila saya service provider adakah ia dilakukan?

Jika kita lihat dokumentasi atas permintaan kitaran hayat , fail berikut dilaksanakan pada permulaan:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php dan dia Middlewares
  • Service Providers: kandungan artikel ini

yang service provider adakah mereka dimuatkan? 

Mereka adalah mereka definites dalam tatasusunan 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,
 
    ],
 
];

Seperti yang kita lihat, terdapat senarai service provider bukan awam dalam folder /vendor, kita tidak boleh menyentuh atau mengubah suainya. Mereka yang menarik minat kami adalah di bawah, dengan BroadcastServicerProvider dilumpuhkan secara lalai, mungkin kerana ia jarang digunakan.

Semua pembekal perkhidmatan ini berjalan dari atas ke bawah, mengulangi senarai dua kali:

  • Lelaran pertama sedang mencari kaedah pilihan register(), berguna untuk (akhirnya) melaksanakan sesuatu yang dikonfigurasikan sebelum kaedah boot().
  • lelaran kedua melaksanakan kaedah boot() daripada semua pembekal. Sekali lagi, satu demi satu, atas ke bawah, tatasusunan 'providers'.
  • Akhirnya, selepas semua pembekal perkhidmatan telah diproses, Laravel bergerak ke menghurai laluan (laluan), menjalankan pengawal, menggunakan templat, dsb.

Pembekal Perkhidmatan Laravel pradefiniti

I Service Providers termasuk dalam Laravel, adalah semua yang terdapat dalam folder app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Semuanya adalah kelas PHP, masing-masing berkaitan dengan topiknya sendiri: App, Auth, Broadcasting, Events e Routes. Tetapi mereka semua mempunyai satu persamaan: kaedah boot().

Di dalam kaedah itu, kita boleh menulis sebarang kod yang berkaitan dengan mana-mana bahagian tersebut: auth, events, route, dan lain-lain. Dengan kata lain, Pembekal Perkhidmatan hanyalah kelas untuk mendaftarkan beberapa fungsi global.

Mereka berasingan sebagai "penyedia" kerana mereka berjalan sangat awal dalam kitaran hayat aplikasi, jadi sesuatu yang global adalah mudah di sini sebelum skrip pelaksana sampai ke Model atau Pengawal.

Kebanyakan fungsi adalah dalam RouteServiceProvider, berikut ialah kodnya:

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());
        });
    }
}

Ini ialah kelas di mana fail dikonfigurasikan route, Dengan routes/web.phproutes/api.php disertakan secara lalaidefinita. Ambil perhatian bahawa untuk API terdapat juga konfigurasi yang berbeza: Awalan titik akhir /api dan perisian tengah api untuk semua routes.

Kita boleh mengedit service providers, yang tiada dalam folder /vendor. Menyesuaikan fail ini dilakukan apabila anda mempunyai banyak laluan dan ingin memisahkannya ke dalam fail tertentu. awak cipta routes/auth.php dan letakkan laluan di sana, kemudian anda "dayakan" fail itu dalam kaedah boot() di RouteServiceProvider, tambahkan ayat ketiga:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider ia kosong. Contoh biasa untuk menambah kod AppServiceProvider, adalah mengenai melumpuhkan pemuatan malas dalam Eloquent . Untuk melakukan ini, anda hanya perlu tambah dua baris dalam kaedah boot():

Surat berita inovasi
Jangan terlepas berita paling penting tentang inovasi. Daftar untuk menerimanya melalui e-mel.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Ini akan membuang pengecualian jika model perhubungan tidak dimuatkan.

Buat sendiri service provider adat

Sebagai tambahan kepada fail pradefinites, kita boleh membuat yang baharu dengan mudah Service Provider, berkaitan dengan topik lain selain daripada topik sebelum inidefiselesai sebagai auth/event/routes.

Contoh yang agak tipikal ialah konfigurasi pandangan Blade. Kita boleh membuat arahan Blade, dan kemudian tambah kod itu ke dalam kaedah boot() daripada mana-mana service provider, termasuk lalai AppServiceProvider. Sekarang mari kita buat a ViewServiceProvider berasingan.

Kita boleh menjananya dengan arahan ini:

php artisan make:provider ViewServiceProvider

Yang akan menjana kelas jadi pradefimalam:

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()
    {
        //
    }
}

Seperti yang kita lihat di dalamnya terdapat dua kaedah:

Kaedah daftar().

Kaedah register() membolehkan kita defipautan nish ke bekas perkhidmatan kami. Sebagai contoh, dalam kod berikut:

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

$this->app ialah pembolehubah global dalam laravel yang boleh diakses oleh kelas tunggal melalui aplikasi.

Singleton adalah ciri. Apabila menggunakan ciri ini, kami memaklumkan aplikasi bahawa apa-apa kelas yang diluluskan sebagai parameter dalam apl seharusnya hanya mempunyai satu tika dalam keseluruhan aplikasi. Ini bermakna MyClass akan diselesaikan sekali dan hanya mempunyai satu contoh, yang boleh diakses menggunakan pembolehubah my_class.

Kaedah boot().

Kaedah boot() membolehkan anda mengakses semua perkhidmatan yang didaftarkan sebelum ini menggunakan kaedah daftar. Anda kemudian boleh memasukkan keseluruhan perkhidmatan dalam aplikasi anda menggunakan kaedah ini.

Berbalik kepada contoh sebelumnya, mari kita keluarkan kaedah tersebut register() dan dalam boot() tambah kod arahan Blade:

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

Satu lagi contoh ViewServiceProvider hormat View Composers, inilah coretannya daripada laman web rasmi 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) {
            //
        });
    }
}

Untuk menjalankan, pembekal baharu ini mesti ditambah/didaftarkan pada tatasusunan pembekal dalam 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

Anda juga mungkin berminat dengan:

Surat berita inovasi
Jangan terlepas berita paling penting tentang inovasi. Daftar untuk menerimanya melalui e-mel.

Artikel baru-baru ini

Masa Depan Di Sini: Bagaimana Industri Perkapalan Merevolusikan Ekonomi Global

Sektor tentera laut adalah kuasa ekonomi global yang sebenar, yang telah menavigasi ke arah pasaran 150 bilion...

1 Mei 2024

Penerbit dan OpenAI menandatangani perjanjian untuk mengawal selia aliran maklumat yang diproses oleh Kepintaran Buatan

Isnin lalu, Financial Times mengumumkan perjanjian dengan OpenAI. FT melesenkan kewartawanannya bertaraf dunia…

30 April 2024

Pembayaran Dalam Talian: Begini Cara Perkhidmatan Penstriman Membuat Anda Membayar Selama-lamanya

Berjuta-juta orang membayar untuk perkhidmatan penstriman, membayar yuran langganan bulanan. Adalah menjadi pendapat umum bahawa anda…

29 April 2024

Veeam menampilkan sokongan paling komprehensif untuk perisian tebusan, daripada perlindungan kepada tindak balas dan pemulihan

Coveware oleh Veeam akan terus menyediakan perkhidmatan tindak balas insiden pemerasan siber. Coveware akan menawarkan keupayaan forensik dan pemulihan…

23 April 2024