Controller ファイルを作成
「src」ディレクトリ内、「Controller」ディレクトリの中に「TestController.php」というファイルを作成。 以下のように記述する。
■場所: \htdocs\chococake\src\Controller ■ファイル名 TestController.php
[php] <?php namespace App\Controller;
use App\Controller\AppController;
/* * / class TestController extends AppController { public function index() { $this->autoRender = false;
echo "<html>";
echo "<head>";
echo "<meta charset=\"UTF-8\">";
echo "<title>コントローラーのテスト</title>";
echo "</head>";
echo "<body>";
echo "<h1>コントローラーのテスト。サンプルテキスト。</h1>";
echo "</body>";
echo "</html>";
} } [/php]
以下のURLにアクセスする。 http://chococake.localhost/test
解説
「TestController」というクラスを作成」した。「Test」はCakePHPのアプリケーションの名前。 ※アプリケーションは、コントローラーとモデルをセットにした最小単位。
アプリケーション名により、クラスは以下のように命名する。 [bash] アプリケーション名Controller [/bash] アプリケーション名が「test」であれば、「TestController」。 またそのファイル名も以下のように命名する。 [bash] アプリケーション名Controller.php [/bash] アプリケーション名が「test」であれば、「TestController.php」。
アプリケーション名は最初の文字を大文字にする。
今回、「test」というアプリケーションのコントローラーで、内部に「index」というアクションメソッドが用意されているため、以下のURLが生成される。
[bash] http://chococake.localhost/test/index [/bash]
autoRender
[php] $this->autoRender = false; [/php] autoRender はページを自動的にレンダリングしレイアウトする機能。
今回はまだレイアウト用のテンプレートを用意していないため、「false」と「true」にすると「Error: The view for TestController::index() was not found.」と表示されエラーになる。
URLパラメータを使用する
アクセスするアドレスの形式は、ドメインの後に「アプリケーション名」と「アクション名」が指定される。 [bash] http://chococake.localhost/test/index [/bash] ドメイン「chococake.localhost」に、アプリケーション「test」とアクション「index」という形式になっていることが確認できる。
パラメータを渡す
「index」アクションに「testparam」というパラメータをアクションに渡すには、以下のようにする。 [bash] http://chococake.localhost/test/index/testparam [/bash] これで「index」アクションに「testparam」というパラメータが渡される。
パラメータは複数渡すことができ、以下のようにすれば「test1」「test2」というパラメータが受け渡される。 [bash] http://chococake.localhost/test/index/test1/test2 [/bash]
受け渡されたパラメータを表示させる
先程の「TestController.php」の「index」アクションを以下のように変更する。
■ファイル名 TestController.php [php] public function index($a = '', $b = '') { $this->autoRender = false;
echo "<html>";
echo "<head>";
echo "<meta charset=\"UTF-8\">";
echo "<title>コントローラーのテスト</title>";
echo "</head>";
echo "<body>";
echo "<h1>コントローラーのテスト。サンプルテキスト。</h1>";
if ($a !== '') {
echo "<p>パラメータAは " . $a . "</p>";
}
if ($b !== '') {
echo "<p>パラメータBは " . $b . "</p>";
}
echo "</body>";
echo "</html>";
} [/php]
解説
「test1」「test2」のパラメータをつけた URL にアクセス。
http://chococake.localhost/test/index/test1/test2
URL につけた「test1」「test2」のパラメータが取得できていることが確認できる。
index アクションの引数に $a $b を指定する。初期値は空にする。 [bash] public function index($a = '', $b = '') [/bash]
引数が空でなかったら、if 文内の処理を実行する。 [bash] if ($a !== '') { echo "<p>パラメータAは " . $a . "</p>"; } [/bash]
※パラメータBに関しても同様。
アクションの呼び出し
Controller 内には複数のアクションを用意することができる。
先程の「TestController.php」の「index」アクションを以下のように変更、さらに「error」アクションを追加する。
[bash] public function index($a = '', $b = '') { // $a 又は $b が空なら setAction メソッドを呼び出す if ($a === '' || $b === '') { $this->setAction('error'); return; }
$this->autoRender = false;
echo "<html>";
echo "<head>";
echo "<meta charset=\"UTF-8\">";
echo "<title>コントローラーのテスト</title>";
echo "</head>";
echo "<body>";
echo "<h1>コントローラーのテスト。サンプルテキスト。</h1>";
if ($a !== '') {
echo "<p>パラメータAは" . $a . "</p>";
}
if ($b !== '') {
echo "<p>パラメータBは" . $b . "</p>";
}
echo "</body>";
echo "</html>";
}
// setAction メソッドで呼び出される error アクション public function error() { $this->autoRender = false; echo "<html>"; echo "<head>"; echo "<meta charset="UTF-8">"; echo "<title>コントローラーのテスト</title>"; echo "</head>"; echo "<body>"; echo "<h1>パラメータが無い、又は足りません</h1>"; echo "</body>"; echo "</html>"; } [/bash]
解説
「test1」「test2」のパラメータをつけた URL にアクセスすると以前と同様にパラメータの内容が表示され、パラメータがない、又はパラメータが1つのURL、例えば「http://chococake.localhost/test/index/test1」にアクセスすると「パラメータが無い、又は足りません」というテキストが表示される。
$a が空、又は $b が空の場合は setAction メソッドを呼び出し、error アクションを実行する。 setAction の後は return し、その後の処理は実行させない。 [bash] if ($a === '' || $b === '') { $this->setAction('error'); return; } [/bash]
パラメータが無い、又は足りない場合に実行される error アクションを用意する。 [bash] public function error() { $this->autoRender = false; echo "<html>"; echo "<head>"; echo "<meta charset="UTF-8">"; echo "<title>コントローラーのテスト</title>"; echo "</head>"; echo "<body>"; echo "<h1>パラメータが無い、又は足りません</h1>"; echo "</body>"; echo "</html>"; } [/bash]
setAction メソッド
setAction メソッドが呼び出せるのは、この Controller に用意されているアクションのみ。 また、setAction は、何も出力されていない段階で実行するため、setAction の後は return し、その後の処理は実行させない。
return を記述しないと、setAction したアクションと、現在実行しているアクションが混じって、以下のように表示されてしまう。
アクションとメソッド
「アクション」「アクションメソッド」「メソッド」などの単語を使用してきたのでここで整理。
CakePHP の規約に以下のように記述がある。
コントローラーにある public メソッドは、アクションとしてブラウザーからアクセス可能になります。 例えば、 /users/view は UsersController の view() メソッドにアクセスします。 protected メソッドや private メソッドはルーティングしてアクセスすることはできません。
引用元:CakePHP の規約
つまり、Controller 内での public メソッドは、上記の例であればブラウザから「/index」「/error」などとしてアクセスすることができる。public メソッド = アクション、アクションメソッド。
しかし本講座に出てきてはいないが、protected メソッドや private メソッドは同様にアクセスすることはできない。