กล่าวอีกนัยหนึ่ง ผู้ให้บริการเป็นเหมือนช่องทางที่เราเทเชื้อเพลิง "คลาส" ลงในถังที่เรียกว่า "คอนเทนเนอร์บริการ" ของเครื่องยนต์ที่เรียกว่า 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'
.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.php
e routes/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() วิธีการช่วยให้เราสามารถ 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
คุณอาจสนใจ:
เมื่อวันจันทร์ที่แล้ว Financial Times ได้ประกาศข้อตกลงกับ OpenAI FT อนุญาติให้ทำข่าวระดับโลก...
ผู้คนนับล้านชำระค่าบริการสตรีมมิ่ง โดยจ่ายค่าธรรมเนียมการสมัครสมาชิกรายเดือน เป็นความเห็นทั่วไปที่คุณ...
Coveware by Veeam จะยังคงให้บริการตอบสนองต่อเหตุการณ์การขู่กรรโชกทางไซเบอร์ต่อไป Coveware จะนำเสนอความสามารถในการนิติเวชและการแก้ไข...
การบำรุงรักษาเชิงคาดการณ์กำลังปฏิวัติภาคส่วนน้ำมันและก๊าซ ด้วยแนวทางเชิงรุกและนวัตกรรมในการจัดการโรงงาน...