初めてのLaravel 5.1 : (25) RESTful Resouce Controller

ここまでで記事(Article)に関して、Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)の実装が完了しました。いわゆるCRUDと言うやつです。実は、このCRUDを実装するに当たって、RESTに基づいてルートやコントローラを定義して来ました。今回はこのRESTとLaravel の ルートやコントローラとの関係について見ていきます。


RESTとは?

実は私も自信を持って解説できないのですが、HTTPのリクエストメソッドとURIに応じて操作対象と操作を特定するAPIの設計概念といった感じで理解しています。RESTの概念に基づいて設計されたものをRESTfulと言います。

Laravel においては大体、以下のパターンで理解すれば間違いないかと思います。

操作対象が記事(Article)の場合

Method URI Action 操作内容
GET /articles ArticlesController@index 一覧表示
GET /articles/create ArticlesController@create 新規作成
POST /articles ArticlesController@store 新規保存
GET /articles/{article} ArticlesController@show 表示
GET /articles/{article}/edit ArticlesController@edit 編集
PUT/PATCH /articles/{article} ArticlesController@update 更新
DELETE /articles/{article} ArticlesController@destroy 削除

RESTful Controller

Laravelでは Controllerを作成するとデフォルトでメソッドが作成されます。このメソッドが上記のパターンに基づいて命名されています。

PostsController.phpを作成してみます。

php artisan make:controller PostsController
<?php // app/Http/Controllers/PostsController.php

namespace AppHttpControllers;

use AppHttpRequests;
use AppHttpControllersController;

use IlluminateHttpRequest;

class posts extends Controller {

    public function index()
    {
        //
    }

    public function create()
    {
        //
    }

    public function store()
    {
        //
    }

    public function show($id)
    {
        //
    }

    public function edit($id)
    {
        //
    }

    public function update($id)
    {
        //
    }

    public function destroy($id)
    {
        //
    }
}

RESTful Routes

PostsController.phpに対応するルートを定義します。

// app/Http/routes.php

Route::resource('posts', 'PostsController');

Route::resourceの1行だけで全てのパターンのルートを定義することができます。
しかし、この記述だけだと何が定義されているのかよく分からないので、以下のコマンドでルートを確認することが出来ます。

php artisan route:list
+--------+----------+--------------------+---------------+----------------------------------------------+------------+
| Domain | Method   | URI                | Name          | Action                                       | Middleware |
+--------+----------+--------------------+---------------+----------------------------------------------+------------+
|        | GET|HEAD | posts              | posts.index   | App\Http\Controllers\PostsController@index   |            |
|        | GET|HEAD | posts/create       | posts.create  | App\Http\Controllers\PostsController@create  |            |
|        | POST     | posts              | posts.store   | App\Http\Controllers\PostsController@store   |            |
|        | GET|HEAD | posts/{posts}      | posts.show    | App\Http\Controllers\PostsController@show    |            |
|        | GET|HEAD | posts/{posts}/edit | posts.edit    | App\Http\Controllers\PostsController@edit    |            |
|        | PUT      | posts/{posts}      | posts.update  | App\Http\Controllers\PostsController@update  |            |
|        | PATCH    | posts/{posts}      |               | App\Http\Controllers\PostsController@update  |            |
|        | DELETE   | posts/{posts}      | posts.destroy | App\Http\Controllers\PostsController@destroy |            |
+--------+----------+--------------------+---------------+----------------------------------------------+------------+

Name欄に Named Route が定義されているところも、ご注目ください。

また、一部のアクションのみが必要な時は以下のようにRouteをカスタマイズすることも出来ます。

// app/Http/routes.php

Route::resource('posts', 'PostsController', ['only' =>['index', 'show']]);

Route::resource('posts', 'PostsController', ['except' => ['create', 'store', 'update', 'destroy']]);

※ Route::resource(‘posts’, ‘PostsController’); は確認の為だけにroutes.phpに挿入したので、ここで削除してください。
※ PostsController.php は確認の為だけに作ったので、ここで削除してください。


ArticlesのRouteを修正

Route::resource を覚えたので Articlesもこの記述に修正します。

// app/Http/routes.php

//Route::get('articles', ['as' => 'articles.index', 'uses' => 'ArticlesController@index']);
//Route::get('articles/create', ['as' => 'articles.create', 'uses' => 'ArticlesController@create']);
//Route::get('articles/{id}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);
//Route::post('articles', ['as' => 'articles.store', 'uses' => 'ArticlesController@store']);
//Route::get('articles/{id}/edit', ['as' => 'articles.edit', 'uses' => 'ArticlesController@edit']);
//Route::patch('articles/{id}', ['as' => 'articles.update', 'uses' => 'ArticlesController@update']);
//Route::delete('articles/{id}', ['as' => 'articles.destroy', 'uses' => 'ArticlesController@destroy']);

Route::resource('articles', 'ArticlesController');

今まで、7行にもわたって定義してきた articlesのルートは実は1行で書けてしまうのでした。

一応、artisanコマンドで route:list を確認しておきます。

php artisan route:list
+--------+----------+--------------------------+------------------+-------------------------------------------------+------------+
| Domain | Method   | URI                      | Name             | Action                                          | Middleware |
+--------+----------+--------------------------+------------------+-------------------------------------------------+------------+
|        | GET|HEAD | articles                 | articles.index   | App\Http\Controllers\ArticlesController@index   |            |
|        | GET|HEAD | articles/create          | articles.create  | App\Http\Controllers\ArticlesController@create  |            |
|        | POST     | articles                 | articles.store   | App\Http\Controllers\ArticlesController@store   |            |
|        | GET|HEAD | articles/{articles}      | articles.show    | App\Http\Controllers\ArticlesController@show    |            |
|        | GET|HEAD | articles/{articles}/edit | articles.edit    | App\Http\Controllers\ArticlesController@edit    |            |
|        | PUT      | articles/{articles}      | articles.update  | App\Http\Controllers\ArticlesController@update  |            |
|        | PATCH    | articles/{articles}      |                  | App\Http\Controllers\ArticlesController@update  |            |
|        | DELETE   | articles/{articles}      | articles.destroy | App\Http\Controllers\ArticlesController@destroy |            |
+--------+----------+--------------------------+------------------+-------------------------------------------------+------------+

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中