首页 > 其他分享 >laravel singleton 单例模式使用

laravel singleton 单例模式使用

时间:2024-09-05 18:26:57浏览次数:9  
标签:laravel function singleton key SomeService someService 单例 public

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 将在应用程序中只实例化一次,并且在不同的请求或地方都会共享同一个实例。

标签:laravel,function,singleton,key,SomeService,someService,单例,public
From: https://www.cnblogs.com/pine007/p/18399004

相关文章

  • (12)非阻塞赋值与阻塞赋值区别(以简单例子说明)
    二者定义在夏语闻老师《verilog数字系统设计教程》中对二者给出如下定义:非阻塞赋值(b<=a):所赋的变量值不能立刻为下面语句所用,块结束才能完成赋值操作,且所赋变量值是上一次赋值得到的阻塞赋值(b=a):赋值语句执行完后块才能结束,b的值在赋值语句执行完后立刻改变一般在时序逻辑中......
  • 章10——面向对象编程(高级部分)——两种单例模式
    代码如下://单例模式//instance--实例//该篇中记录了饿汉模式和懒汉模式publicclassHungryMan{publicstaticvoidmain(String[]args){Single01.say();Single02.say();}}classSingle01{//只能有instance这一个实例。privateS......
  • 单例和静态类的区别
    区别:1.继承问题,单例可以继承和被继承,静态类不能继承(Object类除外)和被继承。2.生命周期不同,单例可以根据需要创建和销毁,静态类的生命周期是程序始终。3.加载时间不同,静态类在首次加载时被实例化,而单例可以懒加载或者异步加载。4.在静态类中不适合维护任何变量,因为他可以被......
  • 将Laravel项目中的"Remove public directory"翻译成中文为"移除公共目录"
    将"Removepublicdirectory"翻译成中文为"移除公共目录"是正确的。"public"通常指的是公共的、共享的或公开的,"directory"则是目录、文件夹的意思。因此,"Removepublicdirectory"的意思是移除公共目录,即删除或取消该目录的公共访问权限,或者将其从项目中删除。这样的翻译能够准......
  • Laravel 生态系统Forge Vapor Nova Envoyer
    Laravel生态系统中包含了多种工具和服务,旨在帮助开发者更高效地构建和维护Laravel应用程序。以下是您提到的几个工具的具体用途:1.LaravelForge用途:LaravelForge是一个服务器管理工具,可以帮助你快速设置和管理服务器。通过Forge,你可以轻松地创建服务器实例,安装必要的软......
  • Java设计模式之单例模式(Singleton)
    单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。这样的模式有几个好处:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。省去了new操作符,降低了系统内存的使用频率,减轻GC压力。有些类如交易所的核心交易引擎......
  • sqlsugar 封装 单例模式 多数据库 泛型
    PlayGround\.config\dotnet-tools.json{"version":1,"isRoot":true,"tools":{"csharpier":{"version":"0.29.1","commands":["dotnet-csharpier......
  • 【ES6】使用Proxy实现单例模式
    前言由于JS没有private关键字,无法私有化构造器,所以下面代码无法限制:classPerson{constructor(){console.log("Personcreated");}}constp1=newPerson();constp2=newPerson();console.log(p1===p2);//false实现通过Person.getInstanc......
  • laravel11+vue项目
    laravel11+vue项目视频地址https://www.youtube.com/watch?v=s6P1dDfl56s&list=PL38wFHH4qYZUdIKP9jG371N3G4kbWAg2c&index=2项目初始化地址直接下载https://github.com/JonVadar/Laravel-Inertia-Vue-Starter``composerinstallnpminstall复制.env.example文件并将其......
  • sqlsugar 封装 单例模式 多数据库
    #PlayGround\.config\dotnet-tools.json{"version":1,"isRoot":true,"tools":{"csharpier":{"version":"0.29.1","commands":["dotnet-csharpi......