#コントローラー
コントローラーとは、ブラウザの要求と、ビュー(Bladeのテンプレートファイル)の間の橋渡し的存在のPHPクラスです。
コマンドで作ります。最後のコントローラー名PageControllerは自由ですが、なるべくリソース(目的のサービスで扱うモノ。User,Item,Book,Storeなど)名称に後ろにControllerはつけたほうがクラス名として分かりやすくなります。
今の場合は、ページを司どるので、PageControllerにしました。
php artisan make:controller PageController
app/Http/Controllers/PageController.phpができました。
コントローラーは最初は空ですので、メソッドを書いていきます。
メソッドがコントローラーに対してやるべきアクションとなります。
例えば、
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PageController extends Controller
{
//
public function index() {
return <<<EOF
<html>
<body>
Demoデモ
</body>
</html>
EOF;
}
}
index()は簡単なHTMLをヒアドキュメントで文字列として返すだけです。
ルーティング情報はコントローラークラス@メソッドとして定義します。
Route::get('/','PageController@index');
これでサーバを動かしてみましょう。ブラウザでみると「Demoデモ」という文字がページに表示されたと思います。
そのページにGETパラメータを渡してみましょう。
ルーティング定義でパスの一部からパラメータを受け取るように変更します。
Route::get('/{str}','PageController@index');
コントローラーのアクションメソッドでその引数を受け取ります。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PageController extends Controller
{
//
public function index($str) {
return <<<EOF
<html>
<body>
Demoデモ:{$str}
</body>
</html>
EOF;
}
}
サーバを起動し、http://[servername]/a/アイウエオというアドレスでブラウザで確認すると、画面の「Demoデモ」という文字の次にアイウエオと表示されたと思います。
#リクエストとレスポンス
Webアプリケーションではブラウザからサーバに対し「要求」することがリクエスト、その要求に対しサーバがブラウザに結果を返す(「応答」する)ことをレスポンスと呼びます。
これはLaravelに限ったことではなく、全てのWebアプリがそういう通信形態です。
コントローラーでuse Illuminate\Http\Response;
を書いてレスポンスクラスを使えるようにし、次のようにrequest/responseの内容を表示させてみましょう。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PageController extends Controller
{
//
public function index($str, Request $request, Response $response) {
return <<<EOF
<html>
<body>
Demoデモ:{$str}
<br><br>
<b>Request:</b><br>
<pre>{$request}</pre>
<b>Response:</b><br>
<pre>{$response}</pre>
</body>
</html>
EOF;
}
}
この結果をブラウザで見ると、リクエストの情報とそのレスポンスの情報が確認できると思います。これらの情報がブラウザとサーバ間でやりとりされているのです。
Laravelで興味深いのは、メソッドの引数に受け取りたい型と変数名を一緒に書いておくと注入(DI)してくることです。
#ビューの置き場所
resources/views
フォルダの下がビューの置き場所ですが、ここはコントローラーごとにフォルダを作ってその中にアクションで使用するBladeファイルを作るのが分かりやすいです。
例えば、前述のコントローラーPageControllerではpageという名前のフォルダを
resources/views
の下に作りそのpageフォルダの下にindexアクションのためのindex.blade.php
をおきます。
mkdir resources/views/page
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel DemoApp</title>
</head>
<body>
<h1>Page : index</h1>{{$str}}<br>
<br>
<b>Request:</b><br>
<pre>{{$request}}</pre>
<b>Response:</b><br>
<pre>{{$response}}</pre>
</body>
</html>
ルーティングは前述と同じように記述します。
Route::get('/','PageController@index');
コントローラーでは、
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PageController extends Controller
{
public function index($str, Request $request, Response $response) {
return view('page.index',compact('str','request','response'));
}
}
コントローラのindexメソッドがview関数でBladeファイルを呼ぶときに、フォルダで切った構成page/index.blade.php
が 'page.index'
という指定に対応つけられます。
#フォーム送信
次はPOST送信でフォームからの情報を受け取ってみましょう。まず/page
のパスがPOST処理を受け付けるようにルーティングを定義します。
Route::get('/','PageController@index');//前述の内容
Route::post('/page','PageController@post');
index.blade.php
にフォーム画面を書きます。
csrf_fieldは、Laravelの機能でトークンを設定して正当な送信しか受け付けないようにするセキュリティ上の仕掛けです。
ーーー(一部抜粋)ーーー
<form method="POST" action="/page">
{{csrf_field()}}
TITLE: <input type="text" name="title"><br>
BODY: <input type="text" name="body">
<input type="submit">
</form>
POSTで受け取った内容を画面出すために新たにpost.blade.php作ります。
<html>
TITLE:{{$title}}<br>
BODY:{{$body}}<br>
</html>
コントローラーを書きます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PageController extends Controller
{
public function index($str, Request $request, Response $response) {
return view('page.index',compact('str','request','response'));
}
public function post(Request $request) {
return view('page.post',['title' => $request->title, 'body' => $request->body]);
}
}
今までcompactで渡していたパラメータは実はハッシュだということがここで分かると思います。
ちなみにcompactは便利な関数で、同スコープの変数をPHP内部の変数テーブルから参照して変数名と変数値をキーと値とするハッシュに変換します。
<?php
$k1 = 'abc';
$k2 = 'xyz';
$h = compact('k1','k2');
var_dump($h);// => ['k1' => 'abc','k2' => 'xyz']
?>
ここでサーバを起動し、http://[servername]/というアドレスでブラウザで確認してみましょう。
フォーム画面で適当に入力し送信すると、その入力情報が次の画面に表示されたと思います。
以上はPOSTの例ですが、GETパラメータでも同じです。
例えば次のようなアドレスでGET渡しで年、月をコントローラーに渡すとき、
http://[servername]/hoge?year=2018&month=10
ルーティングは次のように書きます。(ここではyearやmonthは出てきません)
Route::get('/hoge', 'HogeController@index');
HogeControllerクラスのindexメソッドは次のように書けば$requestオブジェクトからyearやmonthを受け取れます。
public function index(Request $request)
{
$year = $request->year;
$month = $request->month;
}