我创建了一个使用FilesystemCache的服务,我不想在每次调用服务时创建一个新的FilesystemCache,所以我在服务构造函数中有一个参数,我可以给一个实例。 到目前为止我所拥有的:
服务类:
class MyService
{
private $cache;
private $url;
/**
* MyService constructor.
* @param FilesystemCache $cache
*/
public function __construct(FilesystemCache $cache)
{
$this->cache = $cache;
}
private function data()
{
if ($this->cache->has('data')) {
$data = $this->cache->get('data');
} else {
$data = file_get_contents("my/url/to/data");
}
return $data;
}
}
配置:
services:
# Aliases
Symfony\Component\Cache\Adapter\FilesystemAdapter: '@cache.adapter.filesystem'
# Services
services.myservice:
class: AppBundle\Services\MyService
arguments:
- '@cache.adapter.filesystem'
我使用服务的地方:
$myService = $this->container->get('services.myservice');
但我得到的是一个错误:
The definition "services.myservice" has a reference to an abstract definition "cache.adapter.filesystem". Abstract definitions cannot be the target of references.
所以,我的问题是如何修改我的服务或我的声明,或者其他什么,以便能够做我想做的事情:每次调用服务时都不创建实例。
答案 0 :(得分:1)
我强烈建议您使用cache.app
服务而不是您自己的filesystem.cache
。此外,您可以创建自己的适配器。
答案 1 :(得分:0)
为了实现这一点,我必须在我想要在我的服务构造函数中使用的类中注册一个新服务。所以,我的services:
filesystem.cache:
class: Symfony\Component\Cache\Simple\FilesystemCache
services.myservice:
class: AppBundle\Services\MyService
arguments:
- '@filesystem.cache'
就像:
(∀i(0≤i<k→a[i]>0)∧a[k]>0)→∀i(0≤i≤k→a[i]>0)
现在我可以使用我的服务而不会出错。
答案 2 :(得分:0)
使用标准S3.3自动装配设置,这对我有用:
// services.yml
// This basically gives autowire a concrete cache implementation
// No additional parameters are needed
Symfony\Component\Cache\Simple\FilesystemCache:
// And there is no need for any entry for MyService
...
// MyService.php
use Psr\SimpleCache\CacheInterface;
public function __construct(CacheInterface $cache)
这当然只有在容器中只有一个具体的CacheInterface实现时才会起作用。