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リスナーを使用して必要に応じて更新することもできます。

この質問はかなり古いので、答えまたは少なくとも回避策を見つけたと思います。それを提供していただけませんか?あなた自身の質問に答えても大丈夫です。

于 2013-03-06T19:55:19.810 に答える
0

これはSF3+の更新バージョンです。この回答は、AnilとMunMunDasの回答に基づいています。

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

これは私がSymfony4、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 に答える