如何从实体存储库访问我的parameters.yml文件中的参数?
我可以通过以下方式从控制器访问它:
$this->container->getParameter('deadline_for_privileged');
但我似乎无法将容器放入我的存储库......它是一个标准的实体存储库,由doctrine生成。
<?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");
}
}
任何?
答案 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所暗示的那样,这种东西确实不属于存储库。