如何向Symfony Service添加构造函数参数

时间:2017-08-16 14:21:21

标签: php symfony service symfony-3.3

我创建了一个使用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.

所以,我的问题是如何修改我的服务或我的声明,或者其他什么,以便能够做我想做的事情:每次调用服务时都不创建实例。

3 个答案:

答案 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实现时才会起作用。