如何解决 Lumen/Laravel 中的单例?

Posted

技术标签:

【中文标题】如何解决 Lumen/Laravel 中的单例?【英文标题】:How to resolve singleton in Lumen/Laravel? 【发布时间】:2018-09-01 18:30:51 【问题描述】:

我的课程需要 API 密钥 (APIClent.php)。

我想初始化 APIClient.php 并共享实例(单例)

我有两个控制器需要访问已初始化的实例(上图)。

现在每次我调用我的控制器时,它都会获取新的类 (APIClient) 实例,而不是获取现有的实例。

我该如何解决这个问题? 这是我的代码的样子。

AppServiceProvider.php

public function register()

    $this->app->singleton(APIClient::class, function()
    
        return new APIClient(env('API_KEY'));
    );


ListController.php

public function __construct(APIClient $client)

    //does the same thing as below
   // $this->apiClient = App(APIClient::class);

   $this->apiClient = $client;

web.php

就是这一行

$router->get('lists', ['uses' => 'ListController@index']);

感谢任何提示或资源。

谢谢

【问题讨论】:

“每次我调用控制器时,它都会获取新的类实例”是什么意思?您是否在一个会话中使用控制器两次?单例仅在一个 HTTP 会话方面是单一的。 所以我的目标是即使我刷新页面,我仍然应该检索旧对象而不是创建另一个对象。例如,我正在使用邮递员来获取所有可用列表和特定列表。像这样。 localhost:8000/api/lists 和 localhost:8000/api/list/4512 并且这两个请求都使用相同的控制器。我是不是走错路了? Singleton 是每个请求一个且相同的实例,语句结束; 1 个请求等于 = 1 个 Postman 中的“发送”按钮。也不要在你的代码中使用 env('API_KEY') 除了 config/*.php 。您的目标可以通过仅使用缓存或会话来实现。祝你好运。 您检查config/app.php 是否启用了AppServiceProvider 是的,它的启用和类被加载,这意味着它的工作......我认为单例实例可以在整个系统中使用。我将探索使用会话来克服这个问题。谢谢 Kyslik 【参考方案1】:

Singleton 并不意味着该对象将保留在所有客户端请求可用的内存中直到时间结束。它仅仅意味着服务器只会在每个请求中创建一次,如果在同一个请求期间再次需要该对象,它将使用创建的对象。

对于不同的用户,单例可能会有所不同,并且可能会在下一次请求时更改。

您的示例没有展示单例的好处,因为您在控制器的__construct 中使用它,并且此函数也仅在每个请求上调用一次。

【讨论】:

【参考方案2】:
YOU write this : 

public function register()

    $this->app->singleton(APIClient::class, function()
    
        return new APIClient(env('API_KEY'));
    );



each time, you call your `APICLient`, you create a new objet. 
If you want to use singleton pattern,
 just put the write code there without using `new` like 
 public function register()

    $this->app->singleton(APIClient::class, function()
    
        return (env('API_KEY'));
    );

or Something like that.

【讨论】:

谢谢史蒂夫。即使我已经通过其他方式解决了我的问题,我仍然想看看这是否对我有用,到目前为止还没有成功。我认为@kyslik 已经提到了这一点,并且在阅读了这篇文章 [blog.gordon-oheim.biz/…(PHP 中的单例) 后,我相信 PHP 不可能做到这一点

以上是关于如何解决 Lumen/Laravel 中的单例?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的单例模式

关于Lumen / Laravel .env 文件中的环境变量是如何生效的

Java中的单例和继承

nodejs中的单例模式 - 是否需要?

Lumen (Laravel) VS NODE.JS 解决方案

项目中的单例如何管理