服務提供者是 Laravel 中重要的元件,它們負責將各種服務和功能綁定到 Laravel 的服務容器中。
文件:服务提供者
服務提供者角色: 負責註冊和引導服務,綁定服務到服務容器。
建立服務提供者: 使用Artisan
命令生成,並在其中定義服務的綁定和引導邏輯。
註冊服務提供者: 在config/app.php
檔案中註冊自訂服務提供者。
使用服務提供者: 在應用程式中使用app()
輔助函數取得服務實例,並呼叫其方法。
服務提供者是 Laravel 中的核心元件之一,它們負責配置和綁定應用程式所需的各種服務,例如:資料庫連接、路由、快取等;在 Laravel 應用程式中,服務提供者的主要職責包括:
創建服務提供者
使用 Artisan 指令 php artisan make:provider CustomServiceProvider
建立自訂服務提供者,在 app/Providers/CustomServiceProvider.php
中編輯註冊和引導服務:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class CustomServiceProvider extends ServiceProvider
{
// 註冊服務
public function register()
{
// 綁定服務到服務容器
$this->app->singleton('CustomService', function ($app) {
return new \App\Services\CustomService();
});
}
// 引導服務
public function boot()
{
// 可以在這裡執行其他啟動操作
}
}
建立服務類
// app/Services/CustomService.php
namespace App\Services;
class CustomService
{
public function performTask()
{
return 'Task performed!';
}
}
註冊服務提供者
在 config/app.php
中註冊服務提供者:
// config/app.php
'providers' => [
// Other Service Providers
App\Providers\CustomServiceProvider::class,
],
使用服務提供者
在控制器或其他地方,可以透過服務容器來取得和使用綁定的服務:
// 在控制器中使用服務
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
class TestController extends BaseController
{
public function index()
{
// 取得 CustomService 實例
$customService = app('CustomService');
$result = $customService->performTask();
return $result; // 輸出 'Task performed!'
}
}
從零開始建立一個服務提供者可以提供 say_hello 的服務
step 1:建立服務提供者
指令 php artisan make:provider MyServiceProvider
,接著會在 app/Providers
目錄下看到一個 MyServiceProvider.php
的文件
step 2:編輯服務提供者
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class MyServiceProvider extends ServiceProvider
{
/**
* 引導應用程式的服務。
*
* @return void
*/
public function boot(): void
{
// 這裡可以註冊事件或路由等
}
/**
* 註冊應用程式的服務。
*
* @return void
*/
public function register(): void
{
// 這裡可以綁定服務或創建單例等
$this->app->singleton('my_service', function ($app) {
return new \App\Services\MyService();
});
}
}
step 3:創建服務類
這裡比較特別,因為專案建立本來就沒有 Services 的資料夾,所以要自己建立並且生成新的 class,其實也可以直接寫在 controller 中,只是隨著內容愈來愈多,可以把商業邏輯封裝到服務類這樣比較好維護和管理!
mkdir app/Services
touch app/Services/MyService.php
step 4:編輯服務類
<?php
namespace App\Services;
class MyService
{
public function greet($name)
{
return "Hello, $name!";
}
}
step 5:註冊服務提供者
在 config/app.php
中,將你剛剛創建的服務提供者添加到 providers
陣列
'providers' => [
// 其他服務提供者...
App\Providers\MyServiceProvider::class,
],
step 6:在控制器中呼叫服務類啟用
php artisan make:controller MyController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MyController extends Controller
{
protected $myService;
public function __construct()
{
$this->myService = app('my_service');
}
public function index()
{
return $this->myService->greet('World');
}
}
step 7:定義路由
use App\Http\Controllers\MyController;
Route::get('/greet', [MyController::class, 'index']);
step 8:啟服務測試
php artisan serve
postman 呼叫 http://localhost:8000/api/greet
,可以看到 "Hello, World!"。