【发布时间】: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->get(...),但如果您有任何机会使用$x = new MemcachedCacheProvider(...),那将是一个问题。所以我不需要 all 您的代码,只需要使用/创建/注入它的上下文。
标签: php dependency-injection symfony-2.8