Mehrere entity manager für FOSUserBundle

Verwendung verschiedener Entity-Manager /Verbindung auf URL-Basis in Symfony wenn auch Recht einfach. Mit der folgenden routing-Konfiguration

connection:
    pattern:  /a/{connection}
    defaults: { _controller: AcmeTestBundle:User:index }

sowie aus den folgenden Kochbuch;

Wie arbeiten Sie mit Mehreren Entity-Manager und-Verbindungen

Mein controller würde in etwa so Aussehen;

class UserController extends Controller
{
    public function indexAction($connection)
    {

        $products = $this->get('doctrine')
            ->getRepository('AcmeStoreBundle:Product', $connection)
            ->findAll()
        ;
        ..................

und ich werde in der Lage sein zu Holen, Produktinformationen aus verschiedenen em/Verbindung/Datenbank.

Nun, wenn ich so etwas zu meinem routing;

login:
    pattern:  /a/{connection}/login
    defaults: { _controller: FOSUserBundle:Security:login }

Wie kann ich ganz einfach die login mit der Verbindung wie definiert in den Verbindung variable?

Diesem setup davon ausgehen, jede Datenbank hat Ihre eigenen Benutzer-login-Informationen ein (die fos_user Tabelle).

Edit: Aktualisierte routing-Informationen

Edit2:

Ich bin noch neu mit PHP/Symfony/Doctrine obwohl, so bitte vergib mir, wenn ich bin völlig falsch hier. Ich habe versucht, manuell die Verbindung zu FOS\UserBundle\Doctrine\UserManager. Im folgenden wird der Konstruktor der Klasse

//
use Doctrine\Common\Persistence\ObjectManager;
//

public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, ObjectManager $om, $class)
{
    parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer);

    $this->objectManager = $om;
    $this->repository = $om->getRepository($class);

    $metadata = $om->getClassMetadata($class);
    $this->class = $metadata->getName();
}

In einem controller, wir können die folgende Methode verwenden, ändern Sie die em zu 'testen'

$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')

Dafür änderte ich den code wie folgt zu verwenden EntityManager statt ObjectManager.

//
//use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityManager;
//

public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, EntityManager $om, $class)
{
    parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer);

    $this->objectManager = $om;
    $this->repository = $om->getRepository($class);

    $metadata = $om->getClassMetadata($class);
    $this->class = $metadata->getName();
}

Meine app funktioniert einwandfrei ohne Fehler.

Aus der Art, wie es funktioniert mit dem controller, ich habe versucht, ändern Sie die Verbindung, indem Sie einen parameter, um diese Linie dann, aber es ist immer noch mit der Standard-Verbindung.

$this->repository = $om->getRepository($class, 'testing');

Was sonst könnte ich sein fehlen hier?

  • Ich glaube nicht, dass die FOSUserBundle ist entworfen, um zu tun. Könnte man die Funktionalität erweitern, entweder durch einen Beitrag auf das Projekt selbst oder die Schaffung einer Gabel. Oder Sie können schreiben Sie Ihre eigenen UserBundle mit Unterstützung für verschiedene verbindungen.
  • Ich Stimme völlig mit Ihnen. Ich bin noch nicht in der Lage zu finden, eine Lösung/Abhilfe für sein problem von mir, aber wenn ich das mache, habe ich sicher teilen wird es hier, wenn Sie nicht durch einen pull-request auf github 🙂
  • Haben Sie injiziert den richtigen Objekt-manager in die UserManager-Klasse-Konstruktor (die Tests)?
  • fos_user.entity_manager: alias: Lehre.orm.porting_entity_manager sollte Dies funktionieren?
Schreibe einen Kommentar