37 votos

Múltiples gerente de la entidad para el FOSUserBundle

El uso de diferentes Gerente de la Entidad / Relación basada en la URL en Symfony si bastante fácil. Con la siguiente configuración de enrutamiento

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

y a partir de la siguiente libro de cocina;

Cómo trabajar con Varios Gestores de Entidad y Conexiones

Mi controlador sería algo como esto;

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

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

y voy a ser capaz de recuperar la información de producto de diferentes em/conexión/base de datos.

Ahora, si puedo añadir algo como esto para mi enrutamiento;

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

¿Cómo puedo hacer fácilmente el inicio de sesión para utilizar la conexión como se define en la relación de la variable?

Esta configuración asumir cada base de datos tiene su propia cuenta de usuario, información de inicio de sesión (el fos_user tabla).

Edit: Actualizado la información de enrutamiento

Edit2:

Todavía estoy de nuevo con PHP/Symfony/Doctrina, aunque, así que por favor me perdone si estoy completamente equivocado aquí. Traté de configurar manualmente la conexión a FOS\UserBundle\Doctrine\UserManager. El siguiente es el constructor de la clase

//
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();
}

En un controlador, se puede usar el siguiente método para cambiar el em 'pruebas'

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

Por eso he cambiado el código para el siguiente uso de EntityManager en lugar de 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();
}

Mi aplicación funciona bien con ningún error.

De la forma en la que funciona con el controlador, he intentado cambiar la conexión mediante la adición de un parámetro para esta línea de entonces, pero aún así el uso de la conexión predeterminada.

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

¿Qué más podía faltar aquí?

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X