Author image

ぺんすけブログ

リモートワークと子育てとTechな日常

Cover image

LaravelでRoute::resourceを使わずにCRUD Routingを書く

Resource Controller をresource使わずに書く

先に結論です。下記を省略せずに書くとどうなるかという感じです。

Route::resource('post', 'PostController');

Laravel 5.3〜

// 一覧
Route::get('post', 'PostController@index')->name('post.index');
// 保存
Route::post('post', 'PostController@store')->name('post.store');
// 作成
Route::get('post/create', 'PostController@create')->name('post.create');
// 表示
Route::get('post/{post_id}', 'PostController@show')->name('post.show');
// 編集
Route::get('post/edit/{post_id}', 'PostController@edit')->name('post.edit');
// 更新
Route::put('post/{post_id}', 'PostController@update')->name('post.update');
// 削除
Route::delete('post/{post_id}', 'PostController@destroy')->name('post.destroy');

Laravel 〜5.2

// 一覧
Route::get('post', [
    'as' => 'post.index','uses' => 'PostController@index',
]);
// 保存
Route::post('post', [
    'as' => 'post.store','uses' => 'PostController@store',
]);
// 作成
Route::get('post/create', [
    'as' => 'post.create','uses' => 'PostController@create',
]);
// 表示
Route::get('post/{post_id}', [
    'as' => 'post.show','uses' => 'PostController@show',
]);
// 編集
Route::get('post/edit', [
    'as' => 'post.edit','uses' => 'PostController@edit',
]);
// 更新
Route::put('post/{post_id}', [
    'as' => 'post.update','uses' => 'PostController@update',
]);
// 削除
Route::delete('post/{post_id}', [
    'as' => 'post.destroy','uses' => 'PostController@destroy',
]);

(正確にはupdateがresourceの時のようにPUT|PATCHになっておらずこれだとPUTです。)

except, onlyについて

上記の分けて書くモチベーションとして、resourceのルーティング全部はいらないとか、それぞれでmiddlewareを細かく設定したいとかがあるかなと思います。

そういう時に次のような書き方も知っておくと便利です。

// 表示はいらないからそれ以外
Route::resource('post', 'PostController', ['except' => ['show']]);
// 作成、保存、一覧だけ
Route::resource('post', 'PostController', ['only' => ['create', 'store', 'index']]);

典型的なCRUDのためのリソースコントローラについて

結論から入ったので後は基本的なことの補足です。

典型的なCRUDを作成する時に下記ようにするといい感じのControllerを生成してくれます。

php artisan make:controller PostController --resource

その後、ルーティングで下記のようにします。

Route::resource('post', 'PostController');

こんな感じのRoutingが出来上がります。

Method URI Name Action Middleware
GET|HEAD post post.index App\Http\Controllers\PostController@index web
POST post post.store App\Http\Controllers\PostController@store web
GET|HEAD post/create post.create App\Http\Controllers\PostController@create web
GET|HEAD post/edit post.edit App\Http\Controllers\PostController@edit web
GET|HEAD post/{post_id} post.show App\Http\Controllers\PostController@show web
PUT post/{post_id} post.update App\Http\Controllers\PostController@update web
DELETE post/{post_id} post.destroy App\Http\Controllers\PostController@destroy web

これをばらして書いたものが最初に書いたものということでした。