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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie Sie sehen können, FOSUserBundle kann nur einen EntityManager. Sehen Sie es von den Einstellungen orm.xml
Parameter %fos_user.model_manager_name% angegeben in den Einstellungen als model_manager_name
Also in den Konstruktor kommt der EntityManager-Instanz, die nicht akzeptieren, der zweite parameter in der getRepository. Also, die standard-FOSUserBundle kann nur mit einer Datenbank.
Aber dies ist nicht das Ende der Geschichte, es ist Symfony 🙂
Wir können schreiben, UserManager, dass verschiedene db-verbindungen. In der Einstellung sehen, dass fos_user.user_manager ist ein fos_user.user_manager.Standard. Wir finden es in orm.xml
Können wir überschreiben dieser Klasse um einen zusätzlichen parameter, die bestimmen, welche Art von Verbindung, die Sie verwenden möchten. Weitere von ManagerFactory Sie erhalten die gewünschte ObjectManager. Ich schrieb einfaches Beispiel für die zwei databeses (wenn Sie mehr Datenbanken Sie können schreiben Sie Ihre Fabrik für diesen service)
definieren Sie Ihre services Dienstleistungen.yml
Ihre manager
und einfachen test
Tut mir Leid, dass die Antwort so groß war. Wenn etwas nicht klar ist zu Ende, ich den code auf github
FosUserBundle ist nicht in der Lage, um mehr als eine entity-manager.
Der einfachste Weg, ich fand Sie mit 2 Datenbanken, ist das überschreiben der 'checkLoginAction' der SecurityController.