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