【问题标题】:Update profile function更新配置文件功能
【发布时间】:2014-12-09 18:07:04
【问题描述】:

我有一个检查更新用户个人资料信息的功能。目前,如果我每次尝试更新表单上的个人资料信息时都将 |unique:users 放入验证器,它不会让我这样做,因为用户(即我)有我的电子邮件。所以我想出了独特的手段,包括当前用户在内的任何人都不能拥有正在更新的电子邮件。

所以我需要将当前的身份验证电子邮件与数据库中的电子邮件进行比较。如果匹配,则可以更新配置文件信息。我知道这很简单,但我不确定如何实现它以及这是否是正确的逻辑。

那么如果 (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);
          }

}

【问题讨论】:

    标签: laravel laravel-4


    【解决方案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 为 null 您正在创建并且您只需使用 @ 987654331@ 而如果$model 不为空,则使用'unique:table,field,'.$model->getKey()

    【讨论】:

    • 我试过这个laravel.io/bin/PXd8v 并得到这个错误postimg.org/image/y33ekhz55
    • @striker 您忘记在Auth::id() 之前添加逗号。你的代码是'email' => 'required|email|unique:users,email'.Auth::id(),而它应该是'email' => 'required|email|unique:users,email,'.Auth::id()
    • 虽然有趣的是,正在显示的错误是使用 id 作为表名 (SELECT ... FROM `104` ),而您会从该代码拼写错误中期望它将使用 id 作为列的一部分:SELECT ... FROM users WHERE `email104` = ...
    • @alexrussell 谢谢,就是这样。我感谢您的帮助。另外,我想问一下你是否有使用 Laravel 的 twilio 经验。如果是这样,我需要找人付费在我的应用程序上设置短信。如果有兴趣,只需通过我之前发送的错误照片链接中的电子邮件给我发电子邮件。
    • @striker 我没有经验,但是您可能想尝试省钱并自己使用Twilio official SDK for PHPmany Laravel-specific Twilio packages 之一,我敢打赌很容易。
    猜你喜欢
    • 2021-11-13
    • 2019-08-15
    • 1970-01-01
    • 2010-11-23
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多