使用Laravel 5.4,我有用户表
Users table:
- id
- email
- password
- created_at
- updated_at
然后当我插入新的用户数据时,我想自动生成随机密码(如9c41Mr2)。
例如,一旦我插入一个数据:
$data = [
'email' => 'test@example.com',
];
DB::table('users')->insert($data);
我想在MySQL中使用这样的新行:
id: 1 (generated by autoincrement)
email: test@example.com
password: 9c41Mr2 (wow! automatic!)
created_at: 2017-06-14 01:00:00
updated_at: 2017-06-14 01:00:00
那么,有人能告诉我Laravel的最佳方式吗?感谢。
PS:不用担心密码散列问题,我的问题很简单。
答案 0 :(得分:3)
在您的用户模型中:
public function setpasswordAttribute($value)
{
$this->attributes['password'] = bcrypt($value ?: str_random(10));
}
答案 1 :(得分:2)
@Mathieu答案需要根据Laravel的一些新更改进行修改。现在,使用以下外观生成密码:
Hash::make(Str::random(10))
例如
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
public function setpasswordAttribute($value)
{
$this->attributes['password'] = Hash::make(Str::random(10));
}
答案 2 :(得分:1)
使用mutator方法设置密码。通过添加:
覆盖该方法public function setPasswordAttribute($value)
{
$this->attributes['password'] = 'some random password generator';
}
请参阅此处的文档:
https://laravel.com/docs/5.4/eloquent-mutators#defining-a-mutator
设置属性时,根本不需要使用$ value参数。
答案 3 :(得分:1)
所有其他答案都要求显式调用密码修改器(通过在模型属性中传递空密码或调用 $user->password = '';
如果 password
不在属性列表中,这将无法插入,如果 password
未填充,这是生成它所需的代码
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class User extends Model {
protected $fillable = [
//...
'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function save( array $options = [] ) {
if ( ! $this->exists && empty( $this->getAttribute( 'password' ) ) ) {
$this->password = Str::random( 16 );
}
return parent::save( $options );
}
public function setPasswordAttribute( $value ) {
if ( ! empty( $value ) ) {
$this->attributes['password'] = Hash::make( $value );
}
}
}
答案 4 :(得分:0)