Параметры доступа Symfony 4 внутри репозитория - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть класс репозитория с именем 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-> равен нулю.Как я могу это исправить?

Если я запускаю это внутри моего контроллера, он работает нормально и возвращает Google

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Ваш оригинальный код не будет работать, потому что ничто не вызывает 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'
0 голосов
/ 25 сентября 2019

Внедрить контейнер не очень хорошая идея.Попробуйте это

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;
     }
}

Или с помощью установки сеттера

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;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...