20 Stimmen

Wie man Dienst in Symfony 2 Data Fixtures injizieren?

Wie kann ich einen Dienst in Symfony2/Doctrine2 Datenbefestigungen ? Ich möchte Dummy-Benutzer erstellen und benötige die security.encoder_factory Dienst, um meine Passwörter zu verschlüsseln.

Ich habe versucht, meine Data Fixture als Dienst zu definieren

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

Dann in meinem Data Fixture

class LoadDataFixtures implements FixtureInterface {

    protected $passwordEncoder;

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

    public function load($em) {

Aber ich bekam etwas wie

Warnung: Fehlendes Argument 1 für ... \DataFixtures\ORM\LoadDataFixtures ::__construct(), aufgerufen in ...

38voto

Elnur Abdurrakhimov Punkte 44147

Le site Verwendung des Containers in den Fixtures beschreibt genau, was Sie brauchen.

Alles, was Sie tun müssen, ist die Implementierung der ContainerAwareInterface in Ihrer Halterung. Dies wird Symfony dazu veranlassen, den Container über Setter-Injection zu injizieren. Eine Beispiel-Entität würde wie folgt aussehen:

class LoadDataFixtures implements FixtureInterface, ContainerAwareInterface {

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

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

    public function load($em) {

Sie nicht Sie müssen das Gerät als Dienst registrieren. Stellen Sie sicher, dass Sie die verwendeten Klassen über use .

4voto

iiirxs Punkte 4236

Bei DoctrineFixturesBundle v. 3 müssen Sie den Container nicht injizieren, um einen einfachen Dienst zu injizieren. Sie können stattdessen normale Dependency Injection verwenden:

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

// ...
private $encoder;

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

Wenn Sie jedoch den Container benötigen, können Sie ihn über die Eigenschaft $this->container aufrufen.

Dokumentation ici .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X