【问题标题】:Creating an admin user using datafixtures and fosuserbundle使用 datafixtures 和 fosuserbundle 创建管理员用户
【发布时间】:2012-08-02 09:50:28
【问题描述】:

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

【问题讨论】:

  • 你为什么不使用 fos:user:promote ?
  • 我想在我第一次在生产服务器上运行我的应用程序时创建一个管理员用户。如果我很清楚促进工作可以改变已创建用户的角色,但不完全是我想要的。

标签: symfony fosuserbundle


【解决方案1】:

这就是我使用 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();
    }
}

【讨论】:

    【解决方案2】:

    这是 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);
            }
        }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      【解决方案4】:

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

      class LoadUserData implements FixtureInterface, ContainerAwareInterface
      {
          ...
      }
      

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

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

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

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

      【讨论】:

        【解决方案5】:

        关注文档的this 部分。

        【讨论】:

        • 最佳答案。谢谢。
        猜你喜欢
        • 2014-03-12
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多