1

我已经使用 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;
});
4

2 回答 2

1

您必须将您的客户存储库注册为服务,您可以将参数传递给服务

http://symfony.com/doc/current/book/service_container.html#creating-configuring-services-in-the-container

于 2013-09-01T15:04:02.607 回答
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;
});
于 2013-09-11T19:00:33.503 回答