如何在登录Symfony2 FOSUserBundle之前操作用户名?

时间:2014-06-13 11:24:13

标签: php symfony fosuserbundle

我有symfony2网络应用程序(使用FOSUserBundle)我想在身份验证之前添加字符串@something。例如,用户希望通过其用户名myusername登录,但数据库中的真实用户名为myusername@something,因此我必须在身份验证过程之前添加@something。我检查了checkAction(我以为我可以在那里操作发布的用户名)但是这个方法会抛出一个execption:

throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');

在表格发布后,我可以在哪里更改用户名?

1 个答案:

答案 0 :(得分:0)

您可以覆盖ProfileFormType以向表单添加事件侦听器。 在提交之前,这将修改数据并附加@something后缀 如果用户尚未提供。

<?php

namespace Acme\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\ProfileFormType as BaseType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class ProfileFormType extends BaseType
{
    const USERNAME_SUFFIX = '@something';

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
            $data = $event->getData();

            if (isset($data['username']) && $this->usernameHasSuffix($data['username']) {
                $data['username'] = $data['username'].self::USERNAME_SUFFIX;
            }

            $event->setData($data);
        });
    }

    public function getName()
    {
        return 'acme_user_profile';
    }

    private function usernameHasSuffix($username)
    {
        return substr($username, -strlen(self::USERNAME_SUFFIX)) === self::USERNAME_SUFFIX;
    }
}

创建后,只需注册并在服务容器中标记

即可
# src/Acme/UserBundle/Resources/config/services.yml
services:
    acme_user.profile.form.type:
        class: Acme\UserBundle\Form\Type\ProfileFormType
        arguments: [%fos_user.model.user.class%]
        tags:
            - { name: form.type, alias: acme_user_profile }

然后重新配置FOS UserBundle以使用此表单。

# app/config/config.yml
fos_user:
    # ...
    profile:
        form:
            type: acme_user_profile