我正在尝试构建一个重置用户密码的表单。我正在使用 FOSUserBundle 来管理用户,但由于某些架构原因,我不想覆盖 FOSUser 重置 Controller
所以我决定构建自己的类型和 Controller 来重置密码
密码重置类型.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'attr' => ['class' => 'form-group has-feedback'],
'first_options' => array('label' => false,
'attr' => ['placeholder' => 'New Password']
),
'second_options' => array('label' => false,
'attr' => ['placeholder' => 'Repeat Password']),
'invalid_message' => 'Passwords don't match',
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'CoreBundle\Entity\User',
'csrf_token_id' => 'resetting'
));
}
重置 Controller
/**
* @Route("/reset/{token}", name="api_resetting_reset")
*/
public function resetAction(Request $request, $token)
{
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByConfirmationToken($token);
if (null === $user) {
return $this->render('APIBundle:Resetting:error.html.twig');
}
$form = $this->createForm(PasswordResettingType::class, $user);
$form->handleRequest($request);
if ($form->isValid()) {
$user->setConfirmationToken(null);
$user->setPasswordRequestedAt(null);
$user->setPlainPassword($form["plainPassword"]->getData());
$userManager->updateUser($user);
return $this->redirectToRoute('api_resetting_success');
}
return $this->render('APIBundle:Resetting:reset.html.twig', array(
'token' => $token,
'form' => $form->createView()
));
}
重置.html. Twig
{{ form_start(form) }}
{% for passwordField in form.plainPassword %}
<div class="form-group has-feedback">
{{ form_widget(passwordField, { 'attr': {'class': 'form-control'} }) }}
<span class="show">show</span>
{{ form_errors(passwordField) }}
</div>
{% endfor %}
<input type="submit" class="btn" value="Submit" />
{{ form_end(form) }}
但是当我提交表单时,没有设置新密码,ConfirmationToken 和 PasswordRequestedAt 也没有设置为空。
最佳答案
我认为你做错了。如果您查看 FOS User 并详细阅读文档,您将看到他们使用 EventListeners 来执行此操作。 .
这意味着您可以挂上它们并做您的事情。或者,如果你不想这样做,你可以覆盖它并制作你自己的。像你这样半途而废是不会正常工作的。例如,您没有检查检查密码请求是否过期的 onResettingResetInitialize 事件。
关于最后一个答案,我认为你真的不需要这样做:
$encoder = $this->container->get('security.password_encoder');
$user->setPassword($encoder->encodePassword($user, $user->getPlainPassword()));
因为这是 UserManager->UpdateUser() 的工作
顺便说一下:你不能从那里调试并放置一个转储($user);exit();并检查输出是什么以及是否被正确调用。
另外 Boulzy 的评论是对的:/reset/{token} 与 FOS 的路由相同。如果您使用 echo debug_backtrace() 调试 UpdateUser;您还可以从调用 UpdateUser 的位置看到。
关于php - Symfony2 密码重置而不覆盖 FOSUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40046363/
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f
有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte
如果我一直输入geminstallrails使用不同版本的Rails会怎样?例如,我可以输入:geminstallrails--verson3.2.10或geminstallrails这给了我版本3.2.12。问题每次安装都会覆盖之前的吗?它会删除所有旧文件并添加我正在安装的新版本吗?或者如果我运行它两次,它会保留一些文件吗?我正在使用Ubuntu。 最佳答案 它将安装两个独立的gem。实际的可执行文件rails将调用最新版本。你可以覆盖它__例如,rails_3.2.10_将执行Rails3.2.10。bundler顺便说一下,如