laravel singleton 單例模式使用

pine007發表於2024-09-05

laravel singleton 單例模式使用

1、簡介

在 Laravel 中,singleton 是用於將一個類註冊為單例模式的服務,也就是說,整個應用程式生命週期內,Laravel 只會例項化一次該服務。這個服務可以在多個地方共享同一個例項,而不是每次請求時都建立一個新的例項。

2、使用場景

  • 當你希望某個類只被例項化一次,並且可以在整個應用程式中共享。
  • 例如,某個服務類需要維護某種狀態,且這個狀態需要在整個應用程式中保持一致。

3、示例

1. 在服務提供者中定義單例

首先,假設我們有一個服務類 SomeService,我們希望它以單例的形式提供給整個應用程式。

namespace App\Services;

class SomeService
{
    protected $data;

    public function __construct()
    {
        $this->data = [];
    }

    public function addData($key, $value)
    {
        $this->data[$key] = $value;
    }

    public function getData($key)
    {
        return $this->data[$key] ?? null;
    }
}

接下來,我們需要在 AppServiceProvider 或者你自定義的服務提供者中註冊這個服務為單例。

2. 在 AppServiceProvider 中註冊單例

開啟 app/Providers/AppServiceProvider.php 檔案,找到 register 方法並將 SomeService 註冊為單例。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\SomeService;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // 註冊 SomeService 為單例
        $this->app->singleton(SomeService::class, function ($app) {
            return new SomeService();
        });
    }

    public function boot()
    {
        //
    }
}

3. 在控制器中使用單例服務

現在 SomeService 已經被註冊為單例,你可以透過 依賴注入 的方式在控制器中使用它。

namespace App\Http\Controllers;

use App\Services\SomeService;

class SomeController extends Controller
{
    protected $someService;

    public function __construct(SomeService $someService)
    {
        $this->someService = $someService;
    }

    public function index()
    {
        // 呼叫 SomeService 的方法
        $this->someService->addData('name', 'Laravel');

        $name = $this->someService->getData('name');

        return response()->json(['name' => $name]);
    }
}

4. 共享狀態

因為 SomeService 是單例,所有使用該服務的地方都會共享同一個例項。因此,如果在應用的不同地方修改了服務的內部狀態,其他地方也會受影響。

// 第一個控制器
$this->someService->addData('key', 'value');

// 第二個控制器中
$storedValue = $this->someService->getData('key');  // 返回 'value'

4、總結

透過 singleton 註冊服務後,SomeService 將在應用程式中只例項化一次,並且在不同的請求或地方都會共享同一個例項。

相關文章