Php 如何解决Lumen/Laravel中的单态问题?

Php 如何解决Lumen/Laravel中的单态问题?,php,laravel,api,singleton,lumen,Php,Laravel,Api,Singleton,Lumen,我有一个需要API密钥的类(APIClent.php) 我想初始化APIClient.php并共享实例(singleton) 我有两个控制器需要访问初始化的实例(如上) 现在每次我调用我的控制器时,它都会得到一个新的类实例(APIClient),而不是一个存在的实例(如果有的话) 我如何解决这个问题? 这就是我的代码的外观 AppServiceProvider.php public function register() { $this->app->singleton(API

我有一个需要API密钥的类(APIClent.php)

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

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

现在每次我调用我的控制器时,它都会得到一个新的类实例(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']);
任何提示或资源都将不胜感激


感谢

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

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


您的示例没有演示singleton的好处,因为您正在控制器的
\u构造中使用它,并且此函数在每次请求时也只调用一次。

您所说的“每次调用控制器时,它都会得到类的新实例”是什么意思?您是否在一个会话中使用控制器两次?Singleton只在一个HTTP会话中是单一的。所以我的目标是,即使我刷新页面,我仍然应该检索旧对象,而不是创建另一个。e、 我正在使用邮递员来获取所有可用列表和特定列表。像这样。localhost:8000/api/list和localhost:8000/api/list/4512,这两个请求使用相同的控制器。我这样做是错误的吗?Singleton是每个请求的一个相同实例,语句末尾;1个请求等于邮递员中的1个“发送”按钮。也不要在代码中使用
env('API_KEY')
,除非在
config/*.php
中。您的目标可以通过仅使用缓存或会话来实现。祝你好运。你是否检查了
config/app.php
以查看
AppServiceProvider
是否已启用?是的,它已启用,并且类已加载,这意味着它正在工作…我认为可以在整个系统中使用单例实例。我将探索使用会话来克服这个问题。谢谢KyslikThanks Steve。尽管我已经用其他方法解决了我的问题,但我仍然想看看这是否对我有效,到目前为止还没有成功。我想@kyslik已经提到了这一点,在读了这篇文章[(PHP中的Singletons)之后,我决定辞职,相信这在PHP中是不可能的
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.