2017-06-30 166 views
-1

我有一个将更新用户详细信息的表单,但出于显而易见的原因,如果用户想要更新名称而不是电子邮件地址,它将保持不变。然而,尽管我竭尽全力,我无法绕过这一切。Laravel请求,更新验证

所以我们可以说我的电子邮件是:

[email protected]

,我更新我的个人资料

电子邮件仍然是[email protected]

它抛出我一个错误表示该电子邮件必须是唯一的。

所以我想这:

<?php 

namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 

class UserRequest extends FormRequest 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return [ 
      'name' => 'required|alpha_spaces|min:5|max:30', 
      'email' => 'required|email|unique:users,email,'.$user->id, 
      'telephone' => 'required|numeric|max:15', 
      'twitter' => 'alpha_dash', 
      'facebook' => 'alpha_dash', 
      'instagram' => 'alpha_dash', 
     ]; 
    } 
    public function messages() 
    { 
     return [ 
      'name.required' => 'Name is required', 
      'name.alpha_spaces' => 'Name can only contain letters and spaces', 
      'name.min' => 'Name must contain at least 5 characters', 
      'name.max' => 'Name can only contain up to 30 characters', 

      'email.required' => 'Email address is required', 
      'email.email' => 'Email address must be a right format', 
      'email.unique' => 'Email address must be unique', 

      'telephone.required' => 'Telephone is required', 
      'telephone.numeric' => 'Telephone can only contain numbers', 
      'telephone.max' => 'Telephone can only contain maximum of 11 characters', 

      'twitter.alpha_dash' => 'Twitter can only contain letters and dashes', 

      'facebook.alpha_dash' => 'Facebook can only contain letters and dashes', 

      'instagram.alpha_dash' => 'Instagram can only contain letters and dashes', 
    ]; 
    } 
} 

但我得到:

未定义的变量:用户

public function update(UserRequest $request, $id) 
    { 
     $user = User::find($id); 
     $name = $request->input('name'); 
     $email = $request->input('email'); 
     $twitter = $request->input('twitterp'); 
     $facebook = $request->input('facebookp'); 
     $instagram = $request->input('instagramp'); 
     $telephone = $request->input('telephone'); 
     $user->name = $name; 
     $user->email = $email; 
     $user->twitter_personal = $twitter; 
     $user->facebook_personal = $facebook; 
     $user->instagram_personal = $instagram; 
     $user->telephone = $telephone; 
     $result = $user->save(); 
     if($result) { 
     $message = 'success'; 
     }else{ 
     $message = 'error'; 
     } 
     return redirect()->back()->withInput()->with('message', $message); 
    } 
+0

把你的路线和刀片代码请 –

+0

你还没有初始化UserRequest :: rules()方法中的'$ user'变量,因此错误。 – kajetons

+0

我如何初始化它?我试图做到这一点,但我失败了 –

回答

0

下面是一些短

public function update(UserRequest $request, $id) 
{ 
    $user = User::findOrFail($id); 

    $user->name = $request->input('name'); 
    $user->email = $request->input('email'); 
    $user->twitter_personal = $request->input('twitterp'); 
    $user->facebook_personal = $request->input('facebookp'); 
    $user->instagram_personal = $request->input('instagramp'); 
    $user->telephone = $request->input('telephone'); 
    $user->save(); 

    return redirect()->back()->withInput()->with('message', $message); 
} 

并且在查看页面上只填充所有具有旧数据的输入。 Examlpe

<inut type="text" name="email" value="{{ $user->email }}"> 
0

该解决方案可以针对两种情况进行改变。

第一种情况如果通过身份验证的用户本身正在尝试更改电子邮件,则可以通过此方式完成此操作。

'email' => 'required|email|unique:users,email,' . auth()->user()->id,` 

第二种情况可能是超级管理员是负责更改其他用户的邮件这种情况下,可以这样来完成。你的route文件。这里通配符{user}是您需要传递的参数,以确定哪个用户需要更新。

Route::get('/profile/user/{user}/edit', '[email protected]'); 
Route::get('/profile/user/{user}', '[email protected]');` 

validation您可以获取请求参数。

'email' => 'required|email|unique:users,email,' . request()->route()->parameter('user'),` 

注意:参数键必须是通配符名称。在这种情况下,{user}。在你的情况下,可能有{id}{username}