2012-08-04 12 views
7

Estoy tratando de crear un nuevo administrador de usuario desde un dispositivo. Estoy usando FOSUserBundle y Symfony2.Creando un usuario administrador usando datafixtures y fosuserbundle

$userManager = $this->container->get('fos_user.user_manager'); 

//$userAdmin = $userManager->createUser(); 

$userAdmin = new UserAdmin(); 
$userAdmin->setUsername('francis'); 
$userAdmin->setEmail('[email protected]'); 
$userAdmin->setEnabled(true); 
$userAdmin->setRoles(array('ROLE_ADMIN')); 

$userManager->updateUser($userAdmin, true); 

Siempre estoy recibiendo este error:

[ErrorException]           
Notice: Undefined property:  
INCES\ComedorBundle\DataFixtures\ORM\LoadUserAdminData::$container in 
/public_html/Symfony/src/INCES/ComedorBundle/DataFixtures/ORM/LoadUserAdminData.php line 16 
+0

¿Por qué no usas fos: usuario: promover? –

+0

Me gustaría crear un usuario administrador la primera vez que ejecuto mi aplicación en el servidor de producción. Si sé promover bien las obras para cambiar el rol para un usuario ya creado, pero no es exactamente lo que quiero. –

Respuesta

25

Esto funcionó para mí (yo también estoy usando FOSUserBundle):

// Change the namespace! 
namespace Acme\DemoBundle\DataFixtures\ORM; 

use Doctrine\Common\DataFixtures\FixtureInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class LoadUserData implements FixtureInterface, ContainerAwareInterface 
{ 
    //.. $container declaration & setter 

    public function load(ObjectManager $manager) 
    { 
     // Get our userManager, you must implement `ContainerAwareInterface` 
     $userManager = $this->container->get('fos_user.user_manager'); 

     // Create our user and set details 
     $user = $userManager->createUser(); 
     $user->setUsername('username'); 
     $user->setEmail('[email protected]'); 
     $user->setPlainPassword('password'); 
     //$user->setPassword('3NCRYPT3D-V3R51ON'); 
     $user->setEnabled(true); 
     $user->setRoles(array('ROLE_ADMIN')); 

     // Update the user 
     $userManager->updateUser($user, true); 
    } 
} 

Esperamos que esto ayude a alguien! :)

+0

Refresque su trabajo para mí también :) Tnx. https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.md - Esta es la documentación de UserManager si alguien quiere hacer algo diferente :) – Petroff

+0

Funciona bien. Gracias por compartir. +1 – BentCoder

3

Siga this sección de la documentación.

+0

La mejor respuesta. Gracias. –

2

El error se debe a que el contenedor $ no está definido actualmente. Para solucionar esto, agregue ContainerAwareInterface a su definición de clase.

class LoadUserData implements FixtureInterface, ContainerAwareInterface 
{ 
    ... 
} 

Sin embargo, esto no le dará completamente lo que quiere, ya que está creando el usuario sin el UserManager. En su lugar, debe usar la línea que ha comentado.

Me parece que no necesita la clase UserAdmin. Los usuarios administradores deben ser un subconjunto del usuario distinguido solo por los roles que tienen.

Debe utilizar el UserManager para crear un usuario (no UserAdmin) y establecer las funciones. Si necesita mantener un índice de todos los usuarios administradores, una VISTA MySQL podría lograr esto, o podría crear su propia tabla de "memoria caché" personalizada y usar los Escuchadores de Doctrina para actualizarla cuando sea necesario.

Esta pregunta es bastante antigua, así que supongo que encontraste la respuesta o al menos una solución. ¿Podría por favor proporcionar eso? Está bien responder tus propias preguntas.

Cuestiones relacionadas