#前提知識#
MVCアーキテクチャ
- Model:データ処理。DBに関係。
- View:テンプレートのレンダリング。
- Controller:全体制御。<-ここの話
#コントローラ作成#
ターミナルにて下記コマンド。
php artisan make:controller HelloController
app/Http/Controllers
フォルダ内にHellorController.php
が作成される。
これはApp/Http/Controllers
という名前空間にクラスとして配置される。
#コントローラにアクションを追加・ルーティング#
HellorController.php
を開いてみるとデフォルトでいろいろ書いてある。
-
namespace~
:名前空間 -
use~
:Illuminate/Httpパッケージ内のRequestを使える状態にしている。 -
class~
:HelloControllerはControllerというクラスを継承。
この下にアクションを追加していく。
なお、ルートパラメーターとして$id
と$unknown
を渡す。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
public function index($id='noname', $pass='unknown'){
return <<< EOF
<html>
<head>
<title>Hello/Index</title>
<meta chraset="UTF-8">
<style>
body{font-size:16pt;}
h1{font-size:100px; color:#eee;}
</style>
</head>
<body>
<h1>Index</h1>
<p>これは、Helloコントーラのindexアクションです。</p>
<ul>
<li>ID: {$id}</li>
<li>PASS: {$pass}</li>
</ul>
</body>
</html>
EOF;
}
}
?>
次にルートを編集。
routes/web.php
にて
Route::get('hello/{id?}/{pass?}', 'HelloController@index');
これでOK。
#コントローラに複数のアクションを持たせる場合#
###(1)コントローラを記述###
app/Http/Controllers/HelloController.php
を編集。
まず名前空間とRequestを設定(namespace~/use~)。
変数と関数の定義(global~/function~)。
そしてからクラス定義。
クラスの中にアクションを二つ以上持たせることで、コントーラに複数のアクションを持たせる。
<?php
// 名前空間とRequestの使用可能を設定。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// コントーラクラス作成時に必要な関数を自作
global $head, $head, $style, $body, $end;
$head = '<html><head>';
$style = <<<EOF
<style>
body{font-size:16pt;}
h1{font-size:100px; color:#eee;}
</style>
EOF;
$body = '</head><body>';
$end = '</body></html>';
function tag($tag, $txt){
return "<{$tag}>".$txt."</{$tag}>";
}
// コントーラクラスの作成
class HelloController extends Controller
{
// 第一アクション
public function index(){
global $head, $head, $style, $body, $end;
$html=$head.tag('title', 'Hello/Index')
.$style
.$body.tag('h1', 'Index').tag('p', 'this is Index page').'<a href="/hello/other">go to Other page</a>'
.$end;
return $html;
}
// 第二アクション
public function other(){
global $head, $head, $style, $body, $end;
$html=$head.tag('title', 'Hello/Other')
.$style
.$body.tag('h1', 'other').tag('p', 'this is Other page')
.$end;
return $html;
}
}
?>
###(2)ルート情報を編集###
routes/web.php
を編集。
Route:get
の第二引数でコントーラとアクション名を指定。
Route::get('hello', 'HelloController@index');
Route::get('hello/other', 'HelloController@other');
これでコントローラに複数のアクションを持たせることができた。
#シングルアクションコントーラ#
namespace,useは省略。
クラスにつきアクションを一つのみ持つ。
アクション定義部に__invoke()
を足す。
class HelloControllerSingle extends Controller
{
public function __invoke(){
return <<<EOF
<html>
<head>
<meta charset="UTF-8">
<title>Hello/Single</title>
<style>body{font-size:16pt;} h1{font-size:100px; color:#eee;}</style>
</head>
<body>
<h1>Single Action</h1>
<p>これはシングルアクションコントーラのアクションです。</p>
</body>
</html>
EOF;
}
}
#参考書籍#
[PHPフレームワークLaravel入門]
(https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Chapter2-2 Pp.39-51