【问题标题】:Symfony 4 access parameters inside of repository存储库内的 Symfony 4 访问参数
【发布时间】:2019-09-25 18:20:48
【问题描述】:

我有一个名为 EmailRepository 的存储库类

class EmailRepository extends EntityRepository implements ContainerAwareInterface { ... }

我需要将一个参数注入到这个存储库类中,但我不知道如何......

这是我目前在存储库中的内容,正在从我的控制器调用:

控制器:

$em->getRepository(Email::class)->getEmailApi();

存储库

class EmailRepository extends EntityRepository implements ContainerAwareInterface {    

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

     /**
      * @param $array
      */
     public function getEmailApi($array)
     {

         echo $this->container->getParameter('email_api');
     }
}

我总是得到这个错误:

 Call to a member function getParameter() on null

参数不为空,它确实有一个值。我知道它告诉我 $this->container 为空。我该如何解决?

如果我在控制器内部运行它,它可以正常工作并返回 Google

 echo $this->getParameter('email_api');

【问题讨论】:

    标签: php symfony repository


    【解决方案1】:

    注入容器不是一个好主意。试试这个

    services.yaml

    App\Repository\EmailRepository:
        arguments:
            $emailApi: '%env(EMAIL_API)%'
    

    存储库

    class EmailRepository
    {    
    
         protected $emailApi;
    
         public function __construct(string $emailApi) 
         {
             $this->emailApi = $emailApi;
         }
    
         /**
          * @param $array
          */
         public function getEmailApi($array)
         {
             return $this->emailApi;
         }
    }
    

    或者通过setter注入

    services.yaml

    App\Repository\EmailRepository:
        calls:
            - method: setEmailApi
              arguments:
                   $emailApi: '%env(EMAIL_API)%'
    

    存储库

    class EmailRepository extends EntityRepository implements ContainerAwareInterface 
    {    
    
         protected $emailApi;
    
         public function setEmailApi(string $emailApi) 
         {
             $this->emailApi = $emailApi;
         }
    
         /**
          * @param $array
          */
         public function getEmailApi($array)
         {
             return $this->emailApi;
         }
    }
    

    【讨论】:

    • 代码中的任何内容都不会告诉实体管理器使用容器来创建存储库。
    【解决方案2】:

    您的原始代码无法运行,因为没有调用 EmailRepository::setContainer。此外,不鼓励使用 ContainerAware 并注入完整的容器。

    幸运的是,Doctrine 包有一个新的基础存储库类,实体管理器可以使用它从容器中提取存储库,并允许您根据需要注入额外的依赖项。比如:

    namespace App\Repository;
    
    use App\Entity\Email;
    use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
    use Symfony\Bridge\Doctrine\RegistryInterface;
    use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
    
    class EmailRepository extends ServiceEntityRepository // Different class to extend from
    {
        private $emailApi;
    
        public function __construct(RegistryInterface $registry, ParameterBagInterface $parameterBag)
        {
            parent::__construct($registry, Email::class);
    
            $this->emailApi = $parameterBag->get('email_api');
    
        }
    

    所以在这种情况下,我们注入所有参数,然后存储我们需要的参数。

    即使是注入参数包也有点令人不悦。最好注入单个参数,尽管这需要更多配置,因为我们需要使用 services.yaml 显式注入所需的参数:

        public function __construct(RegistryInterface $registry, string $emailApi)
        {
            parent::__construct($registry, Email::class);
    
            $this->emailApi = $emailApi;
    
        }
    #services.yaml
        App\Repository\EmailRepository:
            $emailApi: 'email_api_value'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多