我使用YAML驱动程序定义了我的实体:
My\Entity\Section:
type: entity
table: section
repositoryClass: My\Entity\SectionRepository
正如您所看到的,我已经指定了自定义存储库类。我正在使用结果缓存,我想完全控制缓存TTL,即在不同的存储库之间共享$frontCacheTtl
参数。
这是一个示例存储库,但在通过$entityManager->getRepository('My\Entity\Section')
获取存储库时,我真的不知道如何将参数传递给构造函数:
use Doctrine\ORM\EntityRepository;
class SectionRepository extends EntityRepository
{
public function __construct($frontCacheTtl)
{
$this->frontCacheTtl = $frontCacheTtl;
}
public function findAllForFront()
{
$query = $this->createQueryBuilder('s')
->select(array('s.slug', 's.title', 's.meta_description'))
-getQuery();
$query->useResultCache(true);
$query->setResultCacheLifetime($this->frontCacheTtl);
return $query->getArrayResult();
}
}
如果重要的话,我正在使用SIlex。
编辑:一个解决方案(但我不喜欢它......)将是:
$app['repository.factory'] = $app->protect(function ($entityClass) use ($app) {
// The entity manager (using DoctrinOrmServiceProvider)
$repository = $app['orm.em']->getRepository($entityClass);
// Call setters i.e. dependency injection
$repository->setFrontCacheTtl($app['front_cache_ttl']);
return $repository;
});
答案 0 :(得分:1)
您必须将自定义存储库注册为服务,您可以将参数传递给服务
答案 1 :(得分:0)
除了 user1191081 提供的答案与Symfony一起使用之外,Silex也是如此:
$app['images_repository'] = $app->share(function ($app) {
// The entity manager (using DoctrinOrmServiceProvider)
$repository = $app['orm.em']->getRepository('\App\Entity\Image');
// Call setters i.e. dependency injection
$repository->setFrontCacheTtl($app['front_cache_ttl']);
return $repository;
});