福岡拠点の香月です。
今回はルートとコントローラーを追加します。
ブラウザでURLリンクをクリックしたときにはそれに対応した画面が表示されますが、Webサーバー内ではそのURLに対して表示するデータをモデルから取得し、そのデータをビューで整形してHTMLとして表示します。このモデルとビューの橋渡し役がコントローラーの役目となります。また、要求されたURLをどのコントローラーで処理させるかを指定したのがルート(ルーティング)です。
では早速ルートから指定していきます。laravelプロジェクトのrouteフォルダにweb.phpがあります。これを開いて次のように編集しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ //Route::get('/', function() { // return view('welcome'); //}); Route::get('/', 'TopController@index')->name('top'); |
アプリケーションのトップURL(http://server/)が呼び出されたときに、TopControllerクラスのindexメソッドを呼び出すように指定しています。
->name(‘top’)でこのルートに対して名前を付けています。ここでつけた名前は他の場所でURIを指定するときに使うことができます。
次はTopControllerの作成です。シェルで次のコマンドを実行します。
1 |
# php artisan make:controller TopController |
するとapp/Http/Controllers/TopController.phpにファイルが作成されます。
クラスメソッドとしてindex()を追加してあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TopController extends Controller { public function index() { return view('welcome'); } } |
route\web.php内で直接指定していたようこそ画面の表示を、コントローラーを介して表示するように変更しただけのものですが、このようにしておくことでビュー(ここではようこそ画面)で表示したいデータをphpプログラムで集めて、計算して、整形して表示することができるようになります。
上のphp artisan make:controllerコマンドではオプションは指定していませんでしたが、–model=[Model]や–resourceオプションを指定することで、リソースコントローラを作成することができます。
こうすることで作成されるコントローラ用ファイルにindex(), create(), store(), show(), edit(), update(), destroy()の名前が付いた空のメソッドが一緒に作成されます。例えばStudentモデル用のリソースコントローラを作成するにはこう書きます。
1 |
# php artisan make:controller --model=Student StudentController |
また、リソースコントローラを使う場合はroute/web.phpのルート指定を次のようにすることで、URIとアクションが自動的に割り付けられたルーティングが完成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ //Route::get('/', function() { // return view('welcome'); //}); Route::get('/', 'TopController@index')->name('top'); Route::resources('students', 'StudentController'); |
Route::resource()の1行で次のルーティングが完成します。
動詞 | URI | 対応メソッド | ルート名 |
GET | /students | index | students.index |
GET | /students/create | create | students.create |
POST | /students | store | students.store |
GET | /students/{student} | show | students.show |
GET | /students/{student}/edit | edit | students.edit |
PUT/PATCH | /students/{student} | update | students.update |
DELETE | /students/{student} | destroy | students.destory |
これはいわゆるRESTful APIとして設定されており、必要なURIが揃っているのでリソース(≒モデル)のCRUD(Create, Read, Update, Delete)管理がはかどるでしょう。
リソースコントローラの考え方は他のWebフレームワークでも同様に使われています。Ruby on Railsでは「rails generate scaffold …」コマンドが使えて同じようなルートを生成してくれますし、CakePHPでもルート指定時にまとめて設定してくれる方法があります。これらからLaravelに来た人にとってはわかりやすいですよね。