iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
1

接下來實作 update 和 destroy。

  • Update
  1. 使用者輸入的 validation

    與 register 不一樣的是,並非所有欄位都是必填的,有可能只是更新該使用者的名字或者密碼等。

    public function update(Request $request, $id)
    {
        $rules = [
            'name' => 'string|min:2|max:255',
            'email' => 'email|max:256|unique:users,email,'.$id,
            'password' => 'string|min:6|max:12|confirmed',
        ];
        $validator = Validator::make($request->all(), $rules);
        if($validator->fails()){
            return response(['message' => $validator->errors()]);
        }
    
        /*
        ...
        */
    }
    

    順帶一提,email 驗證方式會與其他兩者稍微不同,若 email 是輸入與自己原本的 email 一樣的值 ( 因為真的無法保證使用者會輸入什麼,所以還是謹慎為上 ),則應該是忽略而不是顯示該 email 被用過的錯誤,可以用此方式忽略:

    'email' => 'email|max:256|unique:users,email,'.$id,
    
  2. 確認該使用者存在與否:

    public function update(Request $request, $id)
    {
        /*
        ...
        */
    
        $user = User::find($id);
        if(!is_null($user)){
            $user->update($request->only(['name', 'email', 'password']));
            return response(['data' => $user]);
        }
        return response(['message' => 'User not found!']);
    
    }
    

    若存在該使用者,update 的值必須要小心,僅僅只有 name、email、password 可以被更新:

    $user->update($request->only(['name', 'email', 'password']));
    

    完整程式碼:
    *UsersController

    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    use App\User;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Validator;
    use Illuminate\Support\Str;
    
    class UsersController extends Controller
    {
        /*
        ...
        */
    
        public function update(Request $request, $id)
        {
            $rules = [
                'name' => 'string|min:2|max:255',
                'email' => 'email|max:256|unique:users,email,'.$id,
                'password' => 'string|min:6|max:12|confirmed',
            ];
            $validator = Validator::make($request->all(), $rules);
            if($validator->fails()){
                return response(['message' => $validator->errors()]);
            }
    
            $user = User::find($id);
            if(!is_null($user)){
                $user->update($request->only(['name', 'email', 'password']));
                return response(['data' => $user]);
            }
            return response(['message' => 'User not found!']);
        }
    }
    
  • Destroy

    此處也是檢查該使用者是否存在

    完整程式碼
    *UsersController

    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    use App\User;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Validator;
    use Illuminate\Support\Str;
    
    class UsersController extends Controller
    {
        /*
        ...
        */
    
        public function destroy($id)
        {
            $user = User::find($id);        
            if(!is_null($user)){
                $user->delete();
                return response(['message' => 'User deleted!!']);
            }
            return response(['message' => 'User not found!']);
        }
    }
    

Postman 實測

  • Update

    在 PUT method 的情況下,若以 form data 傳值,則必須先將HTTP method 改成 POST,再多放一個參數為 _method: PUT

    • 找不到使用者

    image alt

    • email 重複的狀況

    image alt

    • 將名字成功從 king 改成 kingkong

    image alt

  • Delete

    • 找不到使用者

    image alt

    • 成功刪除使用者

    image alt

到此為止 user 的 API 大致建構完成,但似乎有些奇怪,下一篇的 middleware 就來解釋一下原因。

參考資料:

  1. Request in laravel : https://laravel.com/docs/6.x/requests
  2. Could not submit form-data through postman put request : https://stackoverflow.com/questions/51302049/could-not-submit-form-data-through-postman-put-request

上一篇
Day 14 : user ( Controller -- index & show )
下一篇
Day 16 : 用 Middleware 管理權限 ( part I )
系列文
從零開始的Laravel RESTful api30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言