我有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.');
在表格发布后,我可以在哪里更改用户名?
答案 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