iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 20

第 20 天:服務提供者

  • 分享至 

  • xImage
  •  

服務提供者是 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!"。


上一篇
第 19 天:事件與監聽器
下一篇
第 21 天:API 認證與授權
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言