Per utilizzare Gestore entità/connessione diversi in base all'URL in Symfony se abbastanza semplice. Con la seguente configurazione di routingGestore di entità multiple per FOSUserBundle
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
e dal seguente ricettario;
How to work with Multiple Entity Managers and Connections
mio regolatore sarebbe simile a questa;
class UserController extends Controller
{
public function indexAction($connection)
{
$products = $this->get('doctrine')
->getRepository('AcmeStoreBundle:Product', $connection)
->findAll()
;
..................
e sarò in grado di recuperare informazioni sul prodotto da diversi em/connessione/database.
Ora, se aggiungo qualcosa di simile al mio routing;
login:
pattern: /a/{connection}/login
defaults: { _controller: FOSUserBundle:Security:login }
Come posso facilmente fare il login utilizzare la connessione come definito nel variabile connessione?
Questa configurazione presuppone che ogni database disponga delle proprie informazioni di accesso utente (la tabella fos_user).
Modifica: Aggiornato informazioni di routing
Edit2:
io sono ancora nuovo con PHP/Symfony/Dottrina però, quindi ti prego di perdonarmi se ho completamente sbagliato qui. Ho provato a impostare manualmente la connessione a FOS \ UserBundle \ Doctrine \ UserManager. Quello che segue è il costruttore della classe
//
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 un controller, possiamo usare il seguente metodo per cambiare il em a 'testing'
$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')
Per questo ho cambiato il codice di seguito per utilizzare EntityManager invece di 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();
}
La mia app funziona senza errori.
Dal modo in cui funziona con il controller, ho provato a cambiare la connessione aggiungendo un parametro a questa linea, ma sta ancora utilizzando la connessione predefinita.
$this->repository = $om->getRepository($class, 'testing');
Cos'altro potrei mancare qui?
Non penso che FOSUserBundle sia progettato per farlo. È possibile estendere la funzionalità, contribuendo al progetto stesso o creando un fork. O potresti scrivere il tuo UserBundle con supporto per diverse connessioni. – Sgoettschkes
@Sgoettschkes: sono completamente d'accordo con te. Non sono ancora in grado di trovare una soluzione/soluzione al suo problema, ma quando lo farò, sicuramente lo condividerò qui, se non da una richiesta di pull a github :) –
Hai iniettato il gestore degli oggetti corretto nel Costruttore di classe UserManager (quello di prova)? –