2012-08-04 44 views
7

我试图从夹具创建一个新的用户管理员。我使用的是FOSUserBundle和Symfony2。使用datafixtures和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); 

我总是收到此错误:

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

为什么不使用fos:user:promote? – 2012-08-04 21:05:49

+0

我想在第一次在生产服务器上运行我的应用程序时创建一个管理员用户。如果我知道促进作品改变已经创建的用户的角色,但不完全是我想要的。 – 2012-08-05 22:18:08

回答

25

这为我工作(我还使用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); 
    } 
} 

希望这可以帮助别人! :)

+0

为我也酷了:) Tnx。 https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.md - 这是userManager文档,如果有人想做一些不同的事情:) – Petroff 2014-07-03 11:19:50

+0

它运作良好。感谢分享。 +1 – BentCoder 2014-09-23 08:24:07

3

按照文档的this部分。

+0

最好的答案。谢谢。 – 2016-05-15 21:54:39

2

错误是因为$容器当前未定义。要解决这个问题,请将ContainerAwareInterface添加到您的类定义中。

class LoadUserData implements FixtureInterface, ContainerAwareInterface 
{ 
    ... 
} 

这不会完全让你得到你想要的东西,因为你创建的用户没有UserManager。相反,你应该使用你已经注释掉的线。

在我看来,你不需要UserAdmin类。管理员用户应该是用户的子集,只能通过他们拥有的角色进行区分。

您应该使用UserManager创建一个用户(而不是UserAdmin)并设置角色。 如果您需要保留所有管理员用户的索引,MySQL VIEW可以完成此操作,或者您可以创建自己的自定义“缓存”表并使用Doctrine Listeners在需要时更新它。

这个问题是相当古老的,所以我猜你找到了答案或至少一个解决方法。 你能提供吗?回答你自己的问题是可以的。

相关问题