接下來實作 update 和 destroy。
使用者輸入的 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,
確認該使用者存在與否:
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!']);
}
}
Update
在 PUT method 的情況下,若以 form data 傳值,則必須先將HTTP method 改成 POST,再多放一個參數為 _method: PUT
。
Delete
到此為止 user 的 API 大致建構完成,但似乎有些奇怪,下一篇的 middleware 就來解釋一下原因。
參考資料: