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.
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.
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 iniyang 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:
register()
, berguna untuk (akhirnya) melaksanakan sesuatu yang dikonfigurasikan sebelum kaedah boot()
.boot()
daripada semua pembekal. Sekali lagi, satu demi satu, atas ke bawah, tatasusunan 'providers'
.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.php
e routes/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()
:
// 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.
service provider
adatSebagai 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 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() 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:
Sektor tentera laut adalah kuasa ekonomi global yang sebenar, yang telah menavigasi ke arah pasaran 150 bilion...
Isnin lalu, Financial Times mengumumkan perjanjian dengan OpenAI. FT melesenkan kewartawanannya bertaraf dunia…
Berjuta-juta orang membayar untuk perkhidmatan penstriman, membayar yuran langganan bulanan. Adalah menjadi pendapat umum bahawa anda…
Coveware oleh Veeam akan terus menyediakan perkhidmatan tindak balas insiden pemerasan siber. Coveware akan menawarkan keupayaan forensik dan pemulihan…