在這一部分,學習如何建立 RESTful API,包括定義 API 路由、使用控制器處理 API 請求以及使用 API 資源進行資料格式化;跟前面很像,只是這裡主要建置在 routes/api.php
。
前端很需要呼叫 api ,RESTful API 相對的也對前端很重要,關於 RESTful API 是什麼,可以參考30天 JavaScript 提升計畫:從零到精通結合2024年的創新功能 - 第 11 天:API 與 Axios,有其他想法也可以提出討論唷!
在 routes/api.php
中定義路由。
use App\Http\Controllers\Api\PostController;
Route::apiResource('posts', PostController::class);
參考文章:第 4 天:控制器
指令 php artisan make:controller Api/PostController --api
,並且在 app/Http/Controllers/Api/PostController.php
中建立 CRUD 操作。
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
use App\Http\Resources\PostResource;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PostController extends Controller
{
// 取得所有文章
public function index(): Response
{
$posts = Post::all();
return response()->json(PostResource::collection($posts));
}
// 創建新的文章
public function store(StorePostRequest $request): Response
{
$post = Post::create($request->validated());
return response()->json(new PostResource($post), 201);
}
// 顯示單篇文章
public function show(Post $post): Response
{
return response()->json(new PostResource($post));
}
// 更新文章
public function update(UpdatePostRequest $request, Post $post): Response
{
$post->update($request->validated());
return response()->json(new PostResource($post));
}
// 刪除文章
public function destroy(Post $post): Response
{
$post->delete();
return response()->json(null, 204);
}
}
文件:API 资源
指令 php artisan make:resource PostResource
建立一個資源類,並且在 app/Http/Resources/PostResource.php
中定義數據的格式
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class PostResource extends JsonResource
{
public function toArray(Request $request)
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'user' => new UserResource($this->whenLoaded('user')),
'created_at' => $this->created_at->toDateTimeString(),
'updated_at' => $this->updated_at->toDateTimeString(),
];
}
}
參考文章:第 9 天:表單處理與請求
創建表單驗證確認數據的格式
php artisan make:request StorePostRequest
php artisan make:request UpdatePostRequest
在 StorePostRequest
和 UpdatePostRequest
中撰寫驗證規則:
// app/Http/Requests/StorePostRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function rules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
];
}
}
// app/Http/Requests/UpdatePostRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdatePostRequest extends FormRequest
{
public function rules()
{
return [
'title' => 'nullable|string|max:255',
'content' => 'nullable|string',
];
}
}