如果你使用過 Laravel 框架的話,那麼,你不可能沒聽過服務容器和服務提供者。事實上,它們是 Lavavel 框架核心,它們完成 Larvel 應用中服務啟動的艱鉅任務。
在這篇文章中,我們將為大家介紹laravel的服務提供者是什麼?
在學習服務提供者之前,先簡單介紹一下服務容器,服務容器會在服務提供者中被經常使用。
簡而言之,Laravel 服務容器 是一個用於儲存綁定元件的盒子,它也將為應用程式提供所需的服務。
Laravel 文件中描述如下:
Laravel 服务容器是用于管理类的依赖和执行依赖注入的工具 - Laravel 文档
這樣,當我們需要注入一個內建的元件或服務時,可以在建構子或方法中使用類型提示功能注入,然後在使用時從服務容器中自動解析出所需實例及其依賴!是不是很酷?這個功能可以讓我們從手動管理元件中解脫出來,從而降低系統耦合度。
讓我們來看一個簡單實例來加深理解。
<?php Class SomeClass { public function __construct(FooBar $foobarObject) { // use $foobarObject object } }
如你所見,SomeClass 需要使用 FooBar 實例。換句話說它需要依賴其它組件。 Laravel 實作自動注入需要從服務容器中尋找並執行注入適當的依賴。
如果你希望了解 Laravel 是如何知道需要將哪個元件或服務綁定到服務容器中的,答案是透過服務提供者來實現的。服務提供者完成將元件綁定到服務容器的工作。在服務提供者內部,這個工作被稱之為服務容器綁定,綁定處理由服務提供者完成。
服務提供者實作了服務綁定,綁定處理則由 register 方法完成。
同時,這又會引入一個新的問題:Laravel 是如何知道有哪些服務提供者的呢?這個我們貌似還沒討論到吧?我到時看到,之前有說 Laravel 會自動的去查找到服務!朋友,你的問題太多了:Laravel 只是一個框架,它不是一個超級英雄,不是麼?我們當然需要去明確的告知 Laravel 框架我們有哪些服務提供者。
讓我們來瞧 config/app.php
設定檔。你會找到一個用於 Laravel 應用程式啟動過程中被載入的服務提供者設定清單。
'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, Illuminate\Database\DatabaseServiceProvider::class, Illuminate\Encryption\EncryptionServiceProvider::class, Illuminate\Filesystem\FilesystemServiceProvider::class, Illuminate\Foundation\Providers\FoundationServiceProvider::class, Illuminate\Hashing\HashServiceProvider::class, Illuminate\Mail\MailServiceProvider::class, Illuminate\Notifications\NotificationServiceProvider::class, Illuminate\Pagination\PaginationServiceProvider::class, Illuminate\Pipeline\PipelineServiceProvider::class, Illuminate\Queue\QueueServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, Illuminate\Session\SessionServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, /* * Package Service Providers... */ Laravel\Tinker\TinkerServiceProvider::class, /* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, ],
以上就是有關服務容器的基本概念。
什麼是服務提供者
如果說服務容器是提供綁定和依賴注入的的工具,那麼 服務提供者 則是實作綁定的工具。
讓我們先來看一個內容提供的服務提供者服務來理解它的運作原理。開啟 vender/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php
檔。
public function register() { $this->app->singleton('cache', function ($app) { return new CacheManager($app); }); $this->app->singleton('cache.store', function ($app) { return $app['cache']->driver(); }); $this->app->singleton('memcached.connector', function () { return new MemcachedConnector; }); }
這裡我們需要將重點集中在 register 方法中,這個方法用於綁定服務到服務容器。如你所見,這裡一共執行了三個服務的綁定處理:cache
、cache.store
和 memcached.connector
。
然後,當我們需要在 Laravel 中使用 cache 服務是,服務容器會解析出 CacheManager 實例並傳回。也就是說我們只是提供了一個可以從 $this->app
存取的對應關係表。
透過服務提供者綁定服務是 Laravel 服務容器綁定服務的正確開啟方式。同時透過服務提供者的 register 方法,也有利於理解 Laravel 服務容器是如何管理所有的服務的。我們之前提到過,透過從 config/app.php
設定檔讀取服務提供者設定列表,從將所有服務註冊服務容器中。
以上,就是服務提供者的介紹。
更多laravel相關技術文章,請造訪laravel框架入門教學欄位進行學習!
以上是laravel的服務提供者是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!