Symfony2 - 存储库中的getParameter

时间:2014-04-25 14:25:54

标签: symfony parameters repository entity

如何从实体存储库访问我的parameters.yml文件中的参数?

我可以通过以下方式从控制器访问它:

$this->container->getParameter('deadline_for_privileged');

但我似乎无法将容器放入我的存储库......它是一个标准的实体存储库,由doctrine生成。

Spotrepository

<?php

namespace Prophets\ParkingBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * SpotRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class SpotRepository extends EntityRepository
{

    protected function setSpotStatus($spot){
        //method that compares database values with a fixed deadline - the parameter. 
        //It returns if it's earlier/later than the deadline


        $deadline = $this->container->getParameter("deadline_for_privileged");
    }
}

任何?

2 个答案:

答案 0 :(得分:6)

最简单的方法是使用jms / di-extra-bundle注释仅使用如下方法注入参数:

use JMS\DiExtraBundle\Annotation as DI;
use Doctrine\ORM\EntityRepository;

class SpotRepository extends EntityRepository
{

/**
 * @DI\InjectParams({
 *     "param" = @DI\Inject("%app.param%")
 * })
 */
public function setParam($param)
{
    $this->param = $param;
}
通过这种方式,您可以尊重SRP和demeter法则。

另一种方式(没有外部捆绑但缺乏依赖注入的方面)是使用containeraware接口注入容器

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;

use Doctrine\ORM\EntityRepository;

class SpotRepository extends EntityRepository implements ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
    ...

最后一种方式(但&#34;最正确的方式&#34;)是创建一个专用服务(SpotManager),它与构造函数中的存储库和参数一起使用(使用依赖注入)。 这使您可以轻松维护存储库并提供服务,而服务又可以保持轻量级。

答案 1 :(得分:0)

您的services.yml存储库条目应如下所示:

cerad_game__game_repository__doctrine:
    class:  Cerad\Bundle\GameBundle\Doctrine\EntityRepository\GameRepository
    factory_service: 'doctrine.orm.default_entity_manager'
    factory_method:  'getRepository'
    arguments:  
        - 'Cerad\Bundle\GameBundle\Doctrine\Entity\Game'
    calls:
         - [setDeadlineForPriveleged,['%deadline_for_privileged%']]

当然将游戏改为Spot;

然后添加setDeadlineForPriveleged方法。但正如KernelFolla所暗示的那样,这种东西确实不属于存储库。