概要
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)     {         //     } } |