3

所以我正在 Laravel 4 中实现 Ardent,我似乎无法弄清楚为什么这个密码确认不匹配。

我的用户控制器看起来像这样:

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
use LaravelBook\Ardent\Ardent;

class User extends Ardent implements UserInterface, RemindableInterface {

public static $rules = array(
  'first_name'            => 'required|min:2|max:80|alpha',
  'last_name'             => 'required|min:2|max:80|alpha',
  'email'                 => 'required|between:3,64|email|unique:users',
  'postal_code'           => 'required|min:5|max:80',
  'password'              => 'required|between:4,20|confirmed',
  'password_confirmation' => 'same:password',
  'timezone_id'           => 'required|numeric',
);

public $autoPurgeRedundantAttributes = true;

然后在模型商店操作中,我有以下内容:

$user = new User(Input::all());
if($user->save()) {
  // does a bunch of stuff
}

但最后密码确认警告是持久的,我似乎无法理清原因?如果我从密码字段中取消确认选项,一切正常。我似乎无法让他们明白他们是一样的。我在下面包含了一个示例 var_dump,我已经测试并确认它没有通过验证。

array(10) { 
  ["_token"]=> string(40) "726lKBQgckGuLBxmJZ7Kjq4kzzXqADDqv3ZSnMOE" 
  ["first_name"]=> string(3) "asd" 
  ["last_name"]=> string(3) "asd" 
  ["email"]=> string(14) "asdasd@asd.com" 
  ["postal_code"]=> string(7) "XXX XXX" 
  ["new_game_notification"]=> string(1) "1" 
  ["timezone_id"]=> string(1) "5" 
  ["password"]=> string(6) "asdasd" 
  ["password_confirmation"]=> string(6) "asdasd" 
  ["role"]=> string(7) "regular" 
}

我在保存之前进行了自己的密码哈希处理,但为了解决这个问题,我现在已经删除了它。

非常感谢任何建议或指导/方向。

4

6 回答 6

5

也许密码在保存之前被散列......

检查热情的文档:

Route::post('register', function() {
        $rules = array(
            'name'                  => 'required|min:3|max:80|alpha_dash',
            'email'                 => 'required|between:3,64|email|unique:users',
            'password'              => 'required|alpha_num|between:4,8|confirmed',
            'password_confirmation' => 'required|alpha_num|between:4,8'
        );

        $validator = Validator::make(Input::all(), $rules);

        if ($validator->passes()) {
            User::create(array(
                    'name'     => Input::get('name'),
                    'email'    => Input::get('email'),
                    'password' => Hash::make(Input::get('password'))
                ));

            return Redirect::to('/')->with('message', 'Thanks for registering!');
        } else {
            return Redirect::to('/')->withErrors($validator->getMessages());
        }
    }
);

'密码' => '必需|alpha_num|between:4,8|confirmed',

'password_confirmation' => '必需|alpha_num|between:4,8',

于 2014-03-30T16:16:48.097 回答
3

并不是真的要求“password_confirm”在可填充数组中,我有以下规则。

'old_password' => 'required|alphaNum|between:6,16',
'new_password' => 'required|alphaNum|between:6,16|confirmed',
'new_password_confirmation' => 'required|alpha_num|between:4,8'

在一个视图中,我有三个同名的字段:

old_password

new_password

new_password_confirmation

它对我来说工作正常。

验证中的字段必须有一个匹配的字段foo_confirmation。例如,如果验证字段是密码,则输入中必须存在匹配的 password_confirmation 字段。

于 2014-08-22T14:42:37.317 回答
2

事实证明,我已经找到了解决方案。

具有讽刺意味的是,需要在模型上将 pasword_confirmation 设置为可填充,以便 Ardent 上的验证能够看到它并运行验证。

相当简单的解决方案,虽然没有真正记录,但如果数据库中没有字段,为什么要将变量放在模型的可填充数组中。

于 2014-03-31T17:07:16.360 回答
0

在 Laravel 4.2 上有相同的验证错误。不想使用“相同”过滤器或使用 pw_confirmation 设置“填充”数组。也忽略了在 db 中为密码定义字段的显式方法。如果它被记录在案,它必须工作!

所以我的解决方案是:

public static $rules = array(
    'email' => 'required|email|unique:users,email',
    'password' => 'required|min:6|max:20|confirmed'
);

,在控制器中:

public function registration() {
    $input = Input::all();

    $validation = Validator::make($input, User::$rules);
    $input['password'] = Hash::make($input['password']);
    // THIS does the trick
    $input['password_confirmation'] = Hash::make($input['password_confirmation']);

    if ($validation->passes())
    {
        User::create($input);

因此,在“passes()”方法之前,确认字段必须像密码一样被散列。

于 2014-11-01T18:19:17.823 回答
0

有趣的是,我的表格没有附加到模型上,因此您的解决方案不适用于我的案例。

在我的 Laravel 4.2 项目中,我遇到了完全相同的问题:我的密码和密码确认字段匹配,但我仍然收到错误消息,提示我的 password_confirmation 不匹配。

我发现验证规则“已确认”和“相同”似乎发生冲突。在阅读文档并看到我真正需要的是“相同”之后,我从密码中删除了“确认”并逐步使用 XDebug。

这对我有用。基本上,你只需要一个

于 2014-08-02T06:50:30.943 回答
0

解决方案:只需在验证规则中添加变量“password_confirmation”

就像:

$rules = ['password' => 'required|confirmed','password_confirmation'=>''];
于 2019-09-30T08:23:21.300 回答