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
將在應用程式中只例項化一次,並且在不同的請求或地方都會共享同一個例項。