使用datafixtures和fosuserbundle创建管理员用户

时间:2012-08-04 18:35:01

标签: symfony fosuserbundle

我正在尝试从灯具创建新的用户管理员。我正在使用FOSUserBundle和Symfony2。

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

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

$userAdmin = new UserAdmin();
$userAdmin->setUsername('francis');
$userAdmin->setEmail('francis@francis.com');
$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  

5 个答案:

答案 0 :(得分:26)

这对我有用(我也使用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@domain.com');
        $user->setPlainPassword('password');
        //$user->setPassword('3NCRYPT3D-V3R51ON');
        $user->setEnabled(true);
        $user->setRoles(array('ROLE_ADMIN'));

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

希望这有助于某人! :)

答案 1 :(得分:3)

按照文档中的this部分进行操作。

答案 2 :(得分:2)

错误是因为$ container当前未定义。要解决此问题,请将ContainerAwareInterface添加到类定义中。

class LoadUserData implements FixtureInterface, ContainerAwareInterface
{
    ...
}

由于您在没有UserManager的情况下创建用户,因此无法完全满足您的需求。相反,你应该使用你注释掉的那一行。

在我看来,您不需要UserAdmin类。管理员用户应该是用户的子集,仅由他们拥有的角色区分。

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

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

答案 3 :(得分:0)

这是SF3 +的更新版本 该答案基于Anil和Mun Mun Das的答案。

namespace App\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use FOS\UserBundle\Model\UserManagerInterface;

    class AdminFixtures extends Fixture
    {

        private $userManager;

        public function __construct(UserManagerInterface $userManager)
        {
            $this->userManager = $userManager;
        }

        public function load(ObjectManager $manager)
        {
            $user = $this->userManager->createUser();
            $user->setUsername('username');
            $user->setEmail('email@domain.com');
            $user->setPlainPassword('password');
            $user->setEnabled(true);
            $user->setRoles(array('ROLE_ADMIN'));
            $this->userManager->updateUser($user);
        }
    }

答案 4 :(得分:0)

这就是我使用Symfony 4,SonataAdmin和FosUserBundle所做的

namespace App\DataFixtures;

use App\Application\Sonata\UserBundle\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;

class UserFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $user = new User();
        $user->setUsername('yourusername');
        $user->setEmail('youremail@email.com');
        $user->setEnabled(true);
        $user->setPlainPassword('yourpassword');
        $user->setRoles(array('ROLE_SUPER_ADMIN'));
        $manager->persist($user);

        $manager->flush();
    }
}