我有一个检查更新用户个人资料信息的功能。目前,如果我每次尝试更新表单上的个人资料信息时,我都会在验证器中放置| unique:用户,因为用户(就是我)有我的电子邮件,所以不会让我这么做。所以我想出了一个独特的方法,包括当前用户在内的任何人都无法获得正在更新的电子邮件。
所以我需要将当前的auth电子邮件与数据库中的电子邮件进行比较。如果匹配则可以更新配置文件信息。我知道这很简单,但我不确定如何实现它,如果这是正确的逻辑。
那么在这段代码中我会发帖if(Auth :: user() - > email == $ email){.. update email ...} http://laravel.io/bin/GylBV#6此外,这是正确的方式这样做?
public function editProfileFormSubmit()
{
$msg = 'Successfully Updated';
$user_id = Auth::id();
$user = User::find($user_id);
$first_name = Input::get('first_name');
$last_name = Input::get('last_name');
$email = Input::get('email');
$phone_number = Input::get('phone_number');
$validator = Validator::make(Input::all(), array(
'email' => 'required|email',
'first_name' => 'required',
'last_name' => 'required',
'phone_number' => 'required'
));
if ($validator->fails()) {
return Redirect::route('edit-profile')
->withErrors($validator)
->withInput();
}else{
if(Input::hasFile('picture')){
$picture = Input::file('picture');
$type = $picture->getClientMimeType();
$full_image = Auth::id().'.'.$picture->getClientOriginalExtension();
if($type == 'image/png' || $type == 'image/jpg' || $type == 'image/jpeg'){
$upload_success = $picture->move(base_path().'/images/persons/',
$full_image);
if($upload_success) {
$user->picture = $full_image;
} else {
$msg = 'Failed to upload picture.';
}
}else{
$msg = 'Incorrect image format.';
}
}
$user->first_name = $first_name;
$user->last_name = $last_name;
$user->email = $email;
$user->phone_number = $phone_number;
$user->save();
return Redirect::route('invite')->with('global', $msg);
}
}
答案 0 :(得分:1)
担心,Laravel已经考虑过这个潜在的问题!如果您查看the docs for the unique validation rule,您会发现它可能需要一些额外的参数。碰巧的是,在查看唯一约束时,可以给它一个id来忽略。因此,您需要做的是计算当前模型的ID以进行更新并将其传递。在更新已登录用户的配置文件的情况下,Auth::id()
使其变得简单正如你在代码中已有的那样。
$rules = [
'email' => ['required', 'email', 'unique:users,email,'.Auth::id()],
'first_name' => ['required'],
// etc...
];
显然我选择在那里使用数组语法作为验证规则,但你也可以使用pip语法。在一个不太具体的系统中(在crud postSave
类型操作中创建或添加),您仍然可以通过简单地使用$model = Post::find($id)
之类的东西来执行此操作,然后如果$model
为空,则可以执行此操作;重新创建,您只需使用'unique'
,而如果$model
不为空,请使用'unique:table,field,'.$model->getKey()
。