10

我正在尝试从夹具创建一个新的用户管理员。我正在使用 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  
4

5 回答 5

27

这对我有用(我也在使用 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);
    }
}

希望这对某人有帮助!:)

于 2014-06-01T21:25:53.100 回答
3

遵循文档的这一部分。

于 2012-08-05T22:43:20.860 回答
2

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

class LoadUserData implements FixtureInterface, ContainerAwareInterface
{
    ...
}

但是,这并不能完全满足您的需求,因为您正在创建没有 UserManager 的用户。相反,您应该使用已注释掉的行。

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

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

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

于 2013-03-06T19:55:19.810 回答
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);
        }
    }
于 2018-12-06T11:57:39.370 回答
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();
    }
}
于 2019-05-11T20:32:49.520 回答