Symfony3 FOSUserBundle填充表

时间:2016-06-07 23:40:55

标签: php symfony

通过遵循此Symfony docs

,我正在搞乱Symfony3 FOSUserBundle

我成功安装了它并将其设置为docs中的show。经过数据库检查,FSOUserBundle为我创建了这个表:

    +-----------------------+--------------+------+-----+---------+----------------+
    | Field                 | Type         | Null | Key | Default | Extra          |
    +-----------------------+--------------+------+-----+---------+----------------+
    | id                    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | username              | varchar(255) | NO   |     | NULL    |                |
    | username_canonical    | varchar(255) | NO   | UNI | NULL    |                |
    | email                 | varchar(255) | NO   |     | NULL    |                |
    | email_canonical       | varchar(255) | NO   | UNI | NULL    |                |
    | enabled               | tinyint(1)   | NO   |     | NULL    |                |
    | salt                  | varchar(255) | NO   |     | NULL    |                |
    | password              | varchar(255) | NO   |     | NULL    |                |
    | last_login            | datetime     | YES  |     | NULL    |                |
    | locked                | tinyint(1)   | NO   |     | NULL    |                |
    | expired               | tinyint(1)   | NO   |     | NULL    |                |
    | expires_at            | datetime     | YES  |     | NULL    |                |
    | confirmation_token    | varchar(255) | YES  |     | NULL    |                |
    | password_requested_at | datetime     | YES  |     | NULL    |                |
    | roles                 | longtext     | NO   |     | NULL    |                |
    | credentials_expired   | tinyint(1)   | NO   |     | NULL    |                |
    | credentials_expire_at | datetime     | YES  |     | NULL    |                |
    +-----------------------+--------------+------+-----+---------+----------------+

了解这些字段来自BasuUser,我在用户实体中扩展。

下一步我使用Fixtures将数据加载到此表中,但我想知道的是,我需要设置此表中的每个字段,我默认情况下看到的是NULL,那么何时以及如何填充这些字段?

THX

2 个答案:

答案 0 :(得分:1)

如果从FOSUser查看User类,您会看到有一些setter和构造函数可以完成一些必要的工作。查看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;
}

如果您按$user->setUsername('username')填写用户名,则会填充字段username_canonical。与emailemail_canonical类似。如果您不需要通过电子邮件确认,则应将Enabled设置为true。 Salt由构造函数填充。接下来设置plainPassword,然后password自动编码并填充。 Last login可以是哪个。用户登录时自动管理。 Expired仅与限制时间可用的帐户相关联。 Confirmation_token与电子邮件确认帐户相关联。 Password_requested_at允许避免发送数百封密码重置的电子邮件。管理角色使用add而不是set,因为它是数组而不是字段。不要担心roles数据库中的空ROLE_USER,而是保存表卷。 credentials_expired默认为false,但您可以找到此列的创意应用。

最后看看我创建用户超级管理员和10个用户的灯具代码。

<?php
namespace Application\Sonata\UserBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\FixtureInterface;
use AppBundle\Entity\User;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LoadUserData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    /**
     * {@inheritDoc}
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    /**
     * {@inheritDoc}
     */
    public function load(ObjectManager $manager)
    {
        /** @var $manager \FOS\UserBundle\Doctrine\UserManager */
        $manager = $this->container->get('fos_user.user_manager');
        /** @var $user User */
        $user = $manager->createUser();
        $user->setUsername('admin');
        $user->setEmail('admin@example.com');
        $user->setRoles(array('ROLE_SUPER_ADMIN'));
        $user->setEnabled(true);
        $user->setPlainPassword('admin_pass');
        $manager->updateUser($user);
        unset($user);

        $faker = \Faker\Factory::create();
        for ($i = 0; $i < 10; $i++)
        {
            /** @var $user User */
            $user = $manager->createUser();
            $user->setUsername($faker->userName);
            $user->setEmail($faker->safeEmail);
            $user->setRoles(array('ROLE_USER'));
            $user->setEnabled(true);
            $user->setPlainPassword('pass');
            $manager->updateUser($user);
            $this->addReference('user.demo_'.$i, $user);
        }
    }

    /**
     * @return integer
     */
    function getOrder()
    {
        return 10;
    }
}

答案 1 :(得分:0)

只要您在&#34; app / config / security.yml&#34;文件:

- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }

然后你应该能够转到URL /register,然后提示你注册,然后你可以查询fos_user表,你会看到它被填充。

如果您需要使用AD身份验证,则可以浏览my blog on that