ビューとコントローラ
Laravelでビューとコントローラを使ってページを表示してみます。
ルーティング
その前に、ルーティングを設定する必要があります。
最近のフレームワークでは、Apacheのmod_rewriteを使って実際のファイルパスやディレクトリ構成とは無関係に、
URLと実行するファイルの対応付けを行っています。
では、実際に対応付けを行っているのは何処か?というと、
App\routes\web.php
になります。
中身を見てみますと、
Route::get('/home', 'HomeController@index')->name('home');
という記述があると思います。
まぁ何となく予想はつくと思うのですが、
- getメソッドで
- /homeにアクセスされたとき
- コントローラのHomeControllerクラスにあるindexメソッドを呼び出す
- このルーティングの名前をhomeとする
という意味になります。これ以外にもルーティングについては色々できます。参考
コントローラ
コントローラとは、アクセスしてきたURLに対する処理が書かれた実際のプログラムコード。と言うほうが分かりやすいでしょうか。ビジネスロジック。という言い方をすることもあります。
実際には一つのコントローラにゴチャゴチャとあれもこれも詰め込むのはよくない。と言われています。
Laravelにもコントローラが複雑にならないよう様々な工夫があります。がここでは単純にURLにアクセスされたら文字を出すだけのコントローラを作ってみます。
まずはいつものようにひな形を作りましょう。
php artisan make:controller HelloWorldController
特に決まりがあるわけではなさそうですが、コントローラ名の後ろはColtrollerとつけるのがお約束のようです。
これで、App\Httpd\Controllers\配下にひながらファイルが作成されました。
ではここに、表示するメソッドを実装していきます。
今回は単純にGetの引数で渡った値をビューに変数word経由で渡します。
配列のキーがビューで参照する変数名になります。
namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloWorldController extends Controller { public function index(Request $request){ //Getパラメタからwordパラメタだけ取得する $word = $request->word; // ビューを返す return view('helloworld', ['word' => $word]); } }
このコントローラに渡すルーティングを設定しましょう。
先ほど説明したように、App\routes\web.phpに以下追記します。
Route::get('/hello', 'HelloWorldController@index')->name('hello');
まだこの段階では/helloにアクセスしたら、紐づいているコントローラのメソッドを呼び出す。までしかできていません。
最後にビューを作成します。
ビューの作成
Laravelは残念ながらビューのひな型生成はできません。ので自力で作成していきます。
LaravelのビューはBladeと呼ばれるテンプレートを使って記述されています。
今回はまぁ細かいことを気にせず、単純に表示するものを作ります。
resources\views\helloworld.blade.phpというファイル名でファイルを作成します。
bladeテンプレートとして認識させるために、<ビュー名>.blade.phpという命名規則があります。
中身はまぁ身も蓋もないのですが・・
Hello {{ $word }} !!
だけにします。
ここに、コントローラで渡した変数がセットされるわけですね。
では、/hello?word=world
にアクセスしてみましょう。
のような感じで表示されると思います。
ではGetパラメタをword以外にしてみましょう。コントローラのところで、wordパラメタだけを取得しているので、
表示されないはずです。
このような感じでLaravelではコントローラとビューをルーティングを使って対応付けを行っていきます。
名前付きルート
今回ルーティングそれぞれに名前を付けています。これを名前付きルートと呼称するようです。
これを付けることによって、URLの生成やリダイレクト先指定などが名前で指定することが可能になります。
例えば、FormをPostする先を指定する場合、ビューのBladeテンプレートで
<form method="POST" action="{{ route('show_lists') }}">
のような指定ができます。
余談
今どきのWebアプリでは、?word=hogehogeのような不細工な渡し方は美しくありませんw
なので、ルーティング設定で
Route::get('/hello/{word}', 'HelloWorldController@index')->name('hello');
のように指定し、({word}の箇所がパラメタ名になります)
/hello/hoge
のようにアクセスすると
のように表示されます。この場合パラメタ{word}は必須パラメタとなり、指定がない場合マッチするルーティングが無いため、404 Not Foundとなります。
任意にしたい場合は、{word?}とルーティングに指定します。
このページの参照回数は、680です。