Как внедрить сервис в Symfony 2 Data Fixtures? - PullRequest
19 голосов
/ 30 декабря 2011

Как я могу внедрить сервис в Symfony2 / Doctrine2 Data Fixtures ? Я хочу создать фиктивных пользователей и мне нужен сервис security.encoder_factory для кодирования моих паролей.

Я попытался определить свой Data Fixture как сервис

myapp.loadDataFixture:
    class: myapp\SomeBundle\DataFixtures\ORM\LoadDataFixtures
    arguments:
        - '@security.encoder_factory'

Тогда в моем Data Fixture

class LoadDataFixtures implements FixtureInterface {

    protected $passwordEncoder;

    public function __construct($encoderFactory) {
        $this->passwordEncoder = $encoderFactory->getEncoder(new User());
    }

    public function load($em) {

Но есть что-то вроде

Предупреждение: отсутствует аргумент 1 для ... \ DataFixtures \ ORM \ LoadDataFixtures :: __ construct (), вызывается в ...

Ответы [ 2 ]

38 голосов
/ 30 декабря 2011

Использование контейнера в разделе Fixtures описывает именно то, что вам нужно.

Все, что вам нужно сделать, это внедрить ContainerAwareInterface в вашем приборе.Это заставит Symfony внедрить контейнер через Setter-Injection.Пример объекта будет выглядеть следующим образом:

class LoadDataFixtures implements FixtureInterface, ContainerAwareInterface {

     /**
     * @var ContainerInterface
     */
    private $container;

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

    public function load($em) {

Вам не нужно регистрировать прибор в качестве службы.Обязательно импортируйте используемые классы через use.

1 голос
/ 16 октября 2018

Для DoctrineFixturesBundle v. 3 вам не нужно вводить контейнер для внедрения простого сервиса. Вместо этого вы можете использовать обычное внедрение зависимостей:

// src/DataFixtures/AppFixtures.php
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

// ...
private $encoder;

public function __construct(UserPasswordEncoderInterface $encoder)
{
    $this->encoder = $encoder;
}

Однако, если вам нужен контейнер, вы можете получить к нему доступ через свойство $ this-> container.

Документация здесь .

...