【问题标题】:Symfony construct() must implement interface Symfony\Component\DependencyInjection\ContainerInterface, none givenSymfonyconstruct() 必须实现接口 Symfony\Component\DependencyInjection\ContainerInterface,没有给出
【发布时间】:2017-10-12 09:15:02
【问题描述】:

我无法理解这个错误。我尝试了所有方法,但无法解决这个问题。谁能告诉我我的错在哪里。

错误:

MemcachedCacheProvider.php 第 14 行中的 FatalThrowableError:类型错误: 参数 1 传递给 AppBundle\Data\CacheProvider\MemcachedCacheProvider::__construct() 必须实现接口 Symfony\Component\DependencyInjection\ContainerInterface,没有给出, 在第 373 行调用 ...app\cache\dev\appDevDebugProjectContainer.php

MemcachedCacheProvider.php ;

    <?php

    namespace AppBundle\Data\CacheProvider;

    use AppBundle\Data\Interfaces\ICacheProvider;
    use AppBundle\Data\Interfaces\ICacheItem;
    use Symfony\Component\DependencyInjection\ContainerInterface;

    class MemcachedCacheProvider implements ICacheProvider
    {
        /** @var ContainerInterface */
        protected $_container;

        public function __construct(ContainerInterface $container) {
            $this->_container = $container;
        }
public function GetItem($cacheKey)
    {
        $result = $this->_container->get('beryllium_cache.client')->get($cacheKey);
        if($result === null
            || !$result)
            return null;

        return $result;
    }

    public function GetItems(array $cacheKeys)
    {
        $cachedItems = array();
        $cache = $this->_container->get('beryllium_cache.client');

        foreach($cacheKeys as $key) {
            $item = $cache->get($key);

            if($item === null || !$item)
                return null;

            $cachedItems[] = $item;
        }

        if(count($cachedItems) == 0)
            return null;

        return $cachedItems;
    }

    public function RemoveItem($cacheKey)
    {
        $this->_container->get('beryllium_cache.client')->delete($cacheKey);
    }

    public function RemovePrefix($namespaceKey)
    {
        //Used namespaces for memcache, so incrementing namespace value will now work as removing prefix
        $this->_container->get('beryllium_cache.client')->increment($namespaceKey);

        //TODO: No solution for removing items by prefix in memcached. Flushing cache!
        //$this->_container->get('beryllium_cache.client')->flush();
    }

    public function SetItem(ICacheItem $cacheItem)
    {
        if($cacheItem->GetItem() === null)
            return;

        $this->_container->get('beryllium_cache.client')->set($cacheItem->GetKey(), $cacheItem, ($cacheItem->GetExpireTimeStamp() == 0 ? 0 : ($cacheItem->GetExpireTimeStamp()-time())));
    }

    public function SetItems(array $items, $expireTimeStamp)
    {
        $cache = $this->_container->get('beryllium_cache.client');

        foreach($items as &$item) {
            $cache->set($item->GetKey(), $item, ($expireTimeStamp == 0 ? 0 : ($expireTimeStamp-time())));
        }
    }

    public function GetNamespace($namespaceKey)
    {
        $ns = $this->GetItem($namespaceKey);

        if(empty($ns)) {
            //generate a random value to use as namespace and store it
            $ns = mt_rand();

            $this->_container->get('beryllium_cache.client')->set($namespaceKey, $ns, 0);
        }

        return $ns;
    }

还有 services.yml ;

ayon_app.cacheprovider:
        class: AppBundle\Data\CacheProvider\MemcachedCacheProvider
        arguments: ["@service_container"]

【问题讨论】:

  • 该服务在哪里使用/注入?您不会碰巧在某处手动创建它吗?
  • 该服务在 AppBundle 中使用,services.yml 在同一个包中。但是构造函数给了我那个错误。我看不出我的错。
  • 请添加您访问或注入服务的确切代码。
  • @Yoshi 如果我不明白你,请纠正我。那是确切的代码,只是我认为您不需要我的所有代码都会导致该问题。我关于依赖注入的问题,刚刚发送了相关代码。
  • 就目前而言,提供者和服务定义是正确的。但是服务没有正确创建。所以问题可能出在你注入/使用服务的地方。例如,在控制器中您可能会使用$this-&gt;get(...),但如果您有任何机会使用$x = new MemcachedCacheProvider(...),那将是一个问题。所以我不需要 all 您的代码,只需要使用/创建/注入它的上下文。

标签: php dependency-injection symfony-2.8


【解决方案1】:

首先,将完整的 Container 注入服务是非常糟糕的做法,因为您还将获得所有您不要求/不需要的服务。因此,不要对ContainerInterface 进行类型提示,而是仅对您在代码中积极使用的服务进行类型提示,并适当地更新服务定义。

此外,在其他类中使用此缓存提供程序时。您必须键入提示 MemcachedCacheProvider 而不是使用 new 关键字来创建它的新实例。

提示:当您不确定 service.yml 中是否有任何类型提示的服务名称时,您只需在服务中设置以下参数即可自动解析它们:autowire: true

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    相关资源
    最近更新 更多