この記事では、PHPのフレームワークであるLaravelのルーティングの基本について説明します。
インストール直後のルーティング
Laravelプロジェクトを作成した直後にphp artisan serve
コマンドを実行し、ブラウザからhttp://localhost:8000/へアクセスすると下記のページが出力されます。
この時のルーティングは、routes/web.phpで定義されています。
<?php
Route::get('/', function () {
return view('welcome');
});
このルーティング定義により、ルートディレクトリにアクセスされたら、Route::get()の第二引数で指定されたクロージャーが実行されています。
クロージャに記載されているview('welcome')
では、resource/views/welcome.blade.phpの中身を出力しています。
resource/views/welcome.blade.phpの中身を見ると、以下のようになっており、"Laravel"のタイトルや"Documentation~GitHub"のマークアップがあることが確認できます。
...略...
<div class="flex-center position-ref full-height">
@if (Route::has('login'))
<div class="top-right links">
@auth
<a href="{{ url('/home') }}">Home</a>
@else
<a href="{{ route('login') }}">Login</a>
<a href="{{ route('register') }}">Register</a>
@endauth
</div>
@endif
<div class="content">
<div class="title m-b-md">
Laravel
</div>
<div class="links">
<a href="https://laravel.com/docs">Documentation</a>
<a href="https://laracasts.com">Laracasts</a>
<a href="https://laravel-news.com">News</a>
<a href="https://forge.laravel.com">Forge</a>
<a href="https://github.com/laravel/laravel">GitHub</a>
</div>
</div>
</div>
テスト用のルートを追加する
routes/web.phpファイルに、下記の3行を追加してみます。
Route::get('/hello', function () {
return 'hello world';
});
その後、http://localhost:8000/hello へアクセスすると上記のプログラムが実行され、ブラウザにhello worldのメッセージが出力されます。上記の例のようにRoute::get()に指定したクロージャーでreturnでHTMLテキストを返すことでレスポンスの内容を指定できます。
もちろんreturnを使わなくても、下記のようにechoで強制的に応答テキストを記述してもブラウザには出力されますが、これは推奨される方法ではありません。
Route::get('/hello', function () {
echo 'hello world';
});
リクエストのパラメータを受け取る
Laravelのルーティングでは、URLに指定された文字列をパラメータとしてプログラムから簡単に取得できます。
以下のコードを追加し、"http://localhost:8000/hello2/alice"にアクセスすると,"Hello alice"と挨拶してくれます。
Route::get('/hello2/{name}', function ($name) {
echo 'hello '. $name;
});
このルーティングではパラメータを省略できないため、"http://localhost:8000/hello2/"にアクセスするとエラーになることに注意が必要です。
リクエストのパラメータを省略可能にする
以下のように第一引数のパラメータ名へ{name?}
のように、名前の末尾に"?"をつければ省略可能になります。
Route::get('/hello3/{name?}', function ($name = 'world') {
echo 'hello '. $name;
});
上記のルーティングの場合、下記の出力になります。
http://localhost:8000/hello3/alice -> hello alice
http://localhost:8000/hello3/bob -> hello bob
http://localhost:8000/hello3/ -> hello world