php 用户错误,php – 编辑错误的用户错误地暂时更改app.user.username,如何解决?

我们为用户使用Symfony2框架和FOSUserBundle.所以我们拥有自己的UserBundle,它继承自FOSUserBundle.

问题是:当我们发送表单以使用错误的密码编辑用户时,标题中显示的app.user.username会因为表单不正确而更改.然后,当我们重新加载页面时,app.user.username具有正常的用户名(因为它在数据库中没有更改).问题是,为什么app.user.username会暂时更改我们刚用密码错误发送的表单(编辑用户)的值?

我们使用FOSUser的正常路由:

fos_user_security:

resource: "@FOSUserBundle/Resources/config/routing/security.xml"

fos_user_profile:

resource: "@FOSUserBundle/Resources/config/routing/profile.xml"

prefix: /profile

fos_user_register:

resource: "@FOSUserBundle/Resources/config/routing/registration.xml"

prefix: /register

fos_user_resetting:

resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"

prefix: /resetting

fos_user_change_password:

resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"

prefix: /profile

和FOSUser的默认控制器:

public function editAction(Request $request)

{

$user = $this->getUser();

if (!is_object($user) || !$user instanceof UserInterface) {

throw new AccessDeniedException('This user does not have access to this section.');

}

/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */

$dispatcher = $this->get('event_dispatcher');

$event = new GetResponseUserEvent($user, $request);

$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_INITIALIZE, $event);

if (null !== $event->getResponse()) {

return $event->getResponse();

}

/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */

$formFactory = $this->get('fos_user.profile.form.factory');

$form = $formFactory->createForm();

$form->setData($user);

$form->handleRequest($request);

if ($form->isValid()) {

/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */

$userManager = $this->get('fos_user.user_manager');

$event = new FormEvent($form, $request);

$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_SUCCESS, $event);

$userManager->updateUser($user);

if (null === $response = $event->getResponse()) {

$url = $this->generateUrl('fos_user_profile_show');

$response = new RedirectResponse($url);

}

$dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

return $response;

}

return $this->render('FOSUserBundle:Profile:edit.html.twig', array(

'form' => $form->createView()

));

}

以下是标题中显示的代码部分,在使用错误的密码提交表单时不应更改. (app.user.username)

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}

{{ app.user.username }}

{{ 'layout.logout'|trans({}, 'FOSUserBundle') }}

{% else %}

{{ 'layout.register'|trans({}, 'FOSUserBundle') }}

{{ 'layout.login'|trans({}, 'FOSUserBundle') }}

{% endif %}

以下是显示的公式代码:

{{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }}

{{ form_errors(form) }}

{# Génération du label username. #}

{{ form_label(form.username, 'register.form.username'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }}

{# Affichage des erreurs pour ce champ précis. #}

{{ form_errors(form.username) }}

{{ form_widget(form.username, {'attr': {'class': 'form-control'}}) }}

{# Génération du label adresse. #}

{{ form_label(form.address, 'register.form.address'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }}

{# Affichage des erreurs pour ce champ précis. #}

{{ form_errors(form.address) }}

{{ form_widget(form.address, {'attr': {'class': 'form-control'}}) }}

{# Génération du label nom du contact. #}

{{ form_label(form.contactName, 'register.form.contact_name'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }}

{# Affichage des erreurs pour ce champ précis. #}

{{ form_errors(form.contactName) }}

{{ form_widget(form.contactName, {'attr': {'class': 'form-control'}}) }}

{# Génération du label email. #}

{{ form_label(form.email, 'register.form.email'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }}

{# Affichage des erreurs pour ce champ précis. #}

{{ form_errors(form.email) }}

{{ form_widget(form.email, {'attr': {'class': 'form-control'}}) }}

{# Génération du label numéro de téléphone. #}

{{ form_label(form.phone, 'register.form.phone'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }}

{# Affichage des erreurs pour ce champ précis. #}

{{ form_errors(form.phone) }}

{{ form_widget(form.phone, {'attr': {'class': 'form-control'}}) }}

{# Génération du label mot de passe. #}

{{ form_label(form.current_password, 'register.form.password'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }}

{# Affichage des erreurs pour ce champ précis. #}

{{ form_errors(form.current_password) }}

{{ form_widget(form.current_password, {'attr': {'class': 'form-control'}}) }}

{# Pour le bouton, pas de label ni d'erreur, on affiche juste le widget #}

{{ form_widget(form.saveButton, {'attr': {'class': 'btn btn-primary'}, 'label': 'profile.edit.submit'|trans }) }}

{# Génération automatique des champs pas encore écrits.

Dans cet exemple, ce serait le champ CSRF (géré automatiquement par Symfony !)

et tous les champs cachés (type « hidden »). #}

{{ form_rest(form) }}

{# Fermeture de la balise

du formulaire HTML #}

{{ form_end(form) }}

这是我们用于此特定表单的FormType:

public function buildForm(FormBuilderInterface $builder, array $options)

{

// add your custom field

$builder->add('contactName', 'text')

->add('phone', 'text')

->add('address', 'text')

->add('saveButton', 'submit');

}

由于getParent()函数,FormType继承自ProfileFormType(FOSUserBundle中的Default).

感谢您的帮助,找出问题所在.我们不明白为什么app.user.username在标题中发生更改,因为表单是使用错误的密码发送的,并且数据库中的数据未更改,并且对于代码中的法语注释抱歉:).

最佳答案 这是通过设计发生的.在您调用$form-> handleRequest($request)时,用提交的表单数据更新用户实体.当您访问app.user时,您实际上正在访问同一个用户实体.

The docs have some more detail about this

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值