概要
RESTはREpresentational State Transferの略。ここでは以下のような感じで理解しておく。
- リソースを一意に特定できるURL
- GET、POSTなどのメソッド
- ステートレスで完結
Laravelでは、リソースベースでルーティングを記述し、リソースコントローラーを生成することで、RESTに沿ったコードが書ける。
以降、Item
というモデルを仮定する。Item
モデルのインスタンスをitem
、その集合体をitems
とする。
リソースを一意に特定するURL
サーバーにモデルの集合体が保存されていて、これら全体あるいはその中の特定のデータや、データを表示するビューなどのリソースを指定するURLの書き方。
- /items
item
のインスタンスの集合体あるいはこれらを表示するビューなどのリソース。- /items/create
- 1つの
item
を作成するための、入力フォームを含むビューなどのリソース。 - /items/{id}
items
のうちid
で特定される1つのitem
やこれを表示するビューなどのリソース。POST、PATCH、DELETEといったメソッドによってitem
に対する操作を指定する。- /items/{id}/edit
id
で特定されるitemの内容を編集するフォームを含むビューなどのリソース。
メソッド
- GET
- URLで指定したビューのHTMLなどのリソースをサーバーに要求する。
- POST
- URLで指定したリソースの内容をサーバーに送信する。
- PATCH
- URLで指定したリソースの内容でサーバー上のリソースの内容を変更するよう要求する。
- DELETE
- URLで指定したリソースをサーバー上から削除するよう要求する。
- PUT
- 指定した内容でサーバー上のリソースを置き換える。LaravelのRESTfuLの枠組みでは使われない。
RESTfuLなルーティング
メソッドとURLを組み合わせることで、サーバー上のリソースに対する操作が確定する。LaravelでのRESTfuLな操作は以下の7つで、それぞれに応じたコントローラーのアクションにルーティングするのが標準。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// アイテム一覧取得 Route::get('/items', 'ItemController@index'); // アイテム追加フォーム取得 Route::get('/items/create', 'ItemController@create'); // アイテム追加 Route::post('/items', 'ItemController@store'); // 指定アイテムの内容取得 Route::get('/items/{id}', 'ItemController@show'); // 指定アイテム更新フォーム取得 Route::get('/items/{id}/edit', 'ItemController@edit'); // 指定アイテム更新 Route::patch('/items/{id}', 'ItemController@update'); // アイテム削除 Route::delete('/items/{id}', 'ItemController@destroy'); |
リソースベース
リソースベースの考え方
RESTfuLなルーティングと、これに対応したアクションを自動的に生成する方法。
- リソースルーティングの書き方によって、7つのRESTfuLなルーティングを1行で記述
- artisanのコントローラー作成コマンドの
--resource
オプションで、RESTfuLなルーティングに対応した7つのアクションを持つコントローラーを生成
リソースルーティング・名前付きルート
ルーティング定義に以下の1行を書くだけで、RESTfuLな7つのルーティングを書いたのと同義になる。
routes/web.php
1 |
Route::resource('items', 'ItemController'); |
このとき各ルートに名前も付けられる。
1 2 3 4 5 6 7 |
Route::get('/items', 'ItemController@index')->name('items.index'); Route::get('/items/create', 'ItemController@create')->name('items.create'); Route::post('/items', 'ItemController@store')->name('items.store'); Route::get('/items/{id}', 'ItemController@show')->name('items.show'); Route::get('/items/{id}/edit', 'ItemController@edit')->name('items.edit'); Route::patch('/items/{id}', 'ItemController@update')->name('items.update'); Route::delete('items', 'ItemController@destroy')->name('items.destroy'); |
一覧で確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[vagrant@localhost laravel_photo]$ php artisan route:list +--------+-----------+-------------------+---------------+---------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+-------------------+---------------+---------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | POST | items | items.store | App\Http\Controllers\ItemController@store | web | | | GET|HEAD | items | items.index | App\Http\Controllers\ItemController@index | web | | | GET|HEAD | items/create | items.create | App\Http\Controllers\ItemController@create | web | | | DELETE | items/{item} | items.destroy | App\Http\Controllers\ItemController@destroy | web | | | PUT|PATCH | items/{item} | items.update | App\Http\Controllers\ItemController@update | web | | | GET|HEAD | items/{item} | items.show | App\Http\Controllers\ItemController@show | web | | | GET|HEAD | items/{item}/edit | items.edit | App\Http\Controllers\ItemController@edit | web | +--------+-----------+-------------------+---------------+---------------------------------------------+--------------+ |
リソースの限定
以下のように書くことで、特定のリソースのみを選んだり除外したりできる。
1 2 |
Route::resource('items', 'ItemController')->only(['index', 'create']); Route::resource('items', 'ItemController')->except(['update', 'show']); |
リソースコントローラー
以下のartisanコマンドで、RESTfuLなルーティングに対応したメソッドを持つコントローラーが生成される。
php artisan make:controller ItemController --resource
生成されるコントローラーのアクションは以下のとおり。
index()
create()
store(Request $request)
show($id)
edit($id)
update(Request $request, $id)
destroy($id)
app/Http/Controllers/ItemController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ItemController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } } |