Um andere Entity Manager/Verbindung basierend auf URL in Symfony zu verwenden, wenn ziemlich einfach. Mit der folgenden Routing-KonfigurationMultiple Entity Manager für FOSUserBundle
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
und aus dem folgenden Kochbuch;
How to work with Multiple Entity Managers and Connections
Mein Controller würde wie folgt aussehen;
class UserController extends Controller
{
public function indexAction($connection)
{
$products = $this->get('doctrine')
->getRepository('AcmeStoreBundle:Product', $connection)
->findAll()
;
..................
und ich werde Produktinformationen aus verschiedenen em/Verbindung/Datenbank abrufen können.
Jetzt, wenn ich etwas zu meinem Routing hinzufügen;
login:
pattern: /a/{connection}/login
defaults: { _controller: FOSUserBundle:Security:login }
Wie kann ich leicht die Login machen Verbindung zu verwenden, wie in der Verbindung Variable definiert?
Bei dieser Konfiguration wird davon ausgegangen, dass jede Datenbank über eigene Benutzeranmeldeinformationen verfügt (die Tabelle fos_user).
Edit: Aktualisiert Routing-Informationen
Edit2:
Ich bin neu noch mit PHP/Symfony/Lehre aber, so wenden Sie sich bitte verzeiht mir, wenn ich hier völlig falsch bin. Ich habe versucht, die Verbindung manuell unter FOS \ UserBundle \ Doctrine \ UserManager. Im Folgenden ist 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, können wir die folgende Methode verwenden, um die EM zu ‚Test‘ zu ändern
$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')
Dafür habe ich den Code wie folgt geändert zu Verwenden Sie EntityManager anstelle von 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 ohne Fehler.
Von der Art, wie es mit dem Controller funktioniert, habe ich versucht, die Verbindung zu ändern, indem Sie einen Parameter zu dieser Zeile hinzufügen, aber es verwendet immer noch die Standardverbindung.
$this->repository = $om->getRepository($class, 'testing');
Was könnte ich hier noch vermissen?
Ich glaube nicht, dass der FOSUserBundle dafür ausgelegt ist. Sie können die Funktionalität erweitern, indem Sie entweder zum Projekt selbst beitragen oder eine Verzweigung erstellen. Oder Sie könnten Ihr eigenes UserBundle mit Unterstützung für verschiedene Verbindungen schreiben. – Sgoettschkes
@Sgoetttschkes: Ich stimme Ihnen vollkommen zu. Ich bin noch nicht in der Lage, eine Lösung/Workaround zu seinem Problem von mir zu finden, aber wenn ich es tue, werde ich es hier sicherlich teilen, wenn nicht durch eine Pull-Anfrage bei Github :) –
Haben Sie den richtigen Objekt-Manager in die injiziert UserManager Klassenkonstruktor (der Test)? –