Help us understand the problem. What is going on with this article?

Laravelのルーティングチートシート

環境

  • Laravel5.1で動くものを前提としています。
  • ただ、5.2以降に関しても補足を入れています。

前提(ここすごく重要)

  • Laravelのルーティングの基本がわかってること。
  • ルーティングの設定は先に書かれたやつのほうが優先度が高い
  • グループはネストできる

基本1

Route::get('/', function() { return 'Hello, World!' });
// URL出力
url('/');

基本2(Laravel5.5で追加)

Route::view('/', 'home'); // viewを直指定するやつ
Route::view('/', 'home', ["foo" => "bar"]); // パラメータも渡せる

基本3

Route::get('/',    'HomeController@index');
Route::post('/',   'HomeController@post');
Route::put('/',    'HomeController@put');
Route::delete('/', 'HomeController@destroy');
// URL出力
action('HomeController@index');

基本使わないけど

Route::match(['get', 'post'], 'foo','HomeController@index'); // GET,POST両方ここに通す
Route::any('bar', function(){}); // 全てのHTTPメソッドに適用

リダイレクト(Laravel5.5から)

Route::redirect('/about_us', '/about'); // /about_usに来たら/aboutに飛ばす。第3引数にHTTPステータスコードを指定可能

別名付ける

Route::get('/', ['uses' => 'HomeController@index', 'as' => 'home']);
Route::get('/', 'HomeController@index')->name('home');
// URL出力
route('home');

URLパラメータ

// idパラメータが無かったらエラー
Route::get('user/{id}', function($id) { return view('user.index', ['user' => User::find($id)]); });

// nameパラメータが含まれてなくても通す
Route::get('foo/{name?}', 'FooController@index');

// whereでパラメータを正規表現バリデーション出来る
Route::get('foo/{name?}', 'FooController@index')->where('name', '[A-Za-z]+');

// グローバル適用されるパラメータの正規表現バリデーション
// (RouteServiceProviderのbootメソッドに追加(parentより前))
$router->pattern('id', '[0-9]+');
// Route::whenはあまり推奨されてない模様→5.2で削除された模様

controllerルーティング

※5.2で非推奨。5.3で削除されました。

Route::controller('users', 'UserController');
// getIndexとかpostIndexとかControllerで設定すればアクセスできるようになる

// asを付けたい場合
Route::controller('users', 'UserController', [
  'getIndex' => 'users.index'
]);

resourceルーティング

Route::resource('photos', 'PhotoController');
// [GET](/photos)           ->index
// [GET](/photos/{id})      ->show($id)
// [GET](/photos/create)    ->create
// [POST](/photos)          ->store
// [GET](/photos/{id})      ->edit($id)
// [PUT/PATCH](/photos/{id})->update($id)
// [DELETE](/photos/{id})   ->destroy($id)

// ネストも出来る
Route::resource('photos.comments', 'PhotoCommentController');
// URLはこんな感じになる( photos/{photoId}/comments/{commentId} )

// only,except
Route::resource('photos', 'PhotoController', [
  'only' => ['index', 'show']
]);

// 5.4からはapi向けのresourceルーティングメソッドが追加
Route::apiResource('photos', 'PhotoController');
// resourceメソッドのcreate,editを省いただけのやつです

group

// ネスト出来る&複数指定可能
Route::group([パラメータ => パラメータ値], function(){

});
// パラメータ一覧
// middleware ... ミドルウェア適用
// namespace ... 名前空間適用(Adminなら'App\Http\Controllers\Admin'以下)
// domain ... サブドメイン適用({account}.myapp.com)
// prefix ... プレフィックス付与(adminとかuser/{user_id}とか)

// なお5.4あたりからチェーンメソッドとして記述も出来るようになりました(Fluent Routing)
// 以前まではgetやpostを書いた後のチェーンはできてたがgroupの部分は最近から
// Route::prefix('admin')
//      ->middleware('admin')
//      ->get(...

モデルとの結合

// RouteServiceProviderのbootメソッドに追加(parentより後)
// この追加は5.2なら不要。自動でインジェクションされるみたい
$router->model('user', 'App\Models\User');

// ルーティング(find({user})した結果が$userに入る、正確にはgetRouteKeyNameでfindした結果)
Route::get('/users/{user}', function(App\Models\User $user) {

  });

// なお、router->modelじゃなくてbindなら独自設定も可能(つまりキャッシュとかも出来るはず)
$router->bind('user', function($value) {
  return App\Models\User::where('name', $value)->first();
  });

メソッドの引数の名前とルーティングのパラメータ名が一致していてModelである場合は自動モデルバインディングされる。基本はidカラムで引っ張ってこようとするので別の名前で引っ張ってきたい場合はEloquent Modelの方にgetRouteKeyNameメソッドを利用して設定しておくか、bindでの取得をやるのが良い。

fagai
Webプログラマだよー、LaravelとDockerやるよー
http://blog.fagai.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした