5

DoctrineFixturesBundle を使用してテストするために、一部のユーザーをデータベースにロードしようとしています。ここ StackOverflow で多くの検索を行ったところ、他の問題について多くのことがわかりました。しかし、誰も私の答えを持っていないようです。FOS User Manager を使用してユーザーをロードしています。以下は私のフィクスチャクラスです。

namespace Kandidly\UserBundle\DataFixtures;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class LoadUserData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    private $container;

    /**
     * {@inheritDoc}
     */
    public function load(ObjectManager $manager)
    {
        $userManager = $this->container->get('fos_user.user_manager');

        $user1 = $userManager->createUser();
        $user1->setFirstName('Admin');
        $user1->setLastName('User');
        $user1->setCity('Somewhere');
        $user1->setState('TN');
        $user1->setUsername('admin');
        $user1->setEmail('admin@example.com');
        $user1->setPlainPassword('admin');
        $user1->setEnabled(true);
        $user1->setRoles(
            array(
                 'ROLE_ADMIN'
            )
        );

        $user2 = $userManager->createUser();
        $user2->setFirstName('Normal');
        $user2->setLastName('User');
        $user2->setCity('Another');
        $user2->setState('CA');
        $user2->setUsername('user');
        $user2->setEmail('use@example.com');
        $user2->setPlainPassword('user');
        $user2->setEnabled(true);
        $user2->setRoles(
            array(
                 'ROLE_USER'
            )
        );

        $userManager->updateUser($user1);
        $userManager->updateUser($user2);

        $this->addReference('admin-user', $user1);
    }

    /**
     * Get the order of this fixture
     *
     * @return integer
     */
    function getOrder()
    {
        return 1;
    }

    /**
     * Sets the Container.
     *
     * @param ContainerInterface|null $container A ContainerInterface instance or null
     *
     * @api
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}

ただし、フィクスチャを実行すると、ソルトが設定されていないというエラーが表示されます。誰でも助けることができますか?

4

1 に答える 1

9

ユーザークラスにコンストラクターがあると思いますか? ソルトは基本 User クラスのコンストラクターで設定されるためです。

// FOS\UserBundle\Model\User

public function __construct()
{
    $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
    $this->enabled = false;
    $this->locked = false;
    $this->expired = false;
    $this->roles = array();
    $this->credentialsExpired = false;
}

独自のコンストラクターがある場合は、それを機能させるために親コンストラクターを呼び出すことを忘れないでくださいparent::__construct()。親コンストラクターへの呼び出しが言及されているFOSUserBundle docsも参照してください。

PHP ドキュメントから: 子クラスがコンストラクターを定義する場合、親コンストラクターは暗黙的に呼び出されません。親コンストラクターを実行するには、子コンストラクター内で parent::__construct() を呼び出す必要があります。子がコンストラクターを定義していない場合は、通常のクラス メソッドと同様に親クラスから継承できます (プライベートとして宣言されていない場合)。

于 2013-06-28T00:30:39.093 に答える