ひとり勉強ログ

ITエンジニアの勉強したことメモ

#02 Controller の作成・パラメータを表示・アクションの呼び出し

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 &quot;&lt;html&gt;&quot;;
echo &quot;&lt;head&gt;&quot;;
echo &quot;&lt;meta charset=\&quot;UTF-8\&quot;&gt;&quot;;
echo &quot;&lt;title&gt;コントローラーのテスト&lt;/title&gt;&quot;;
echo &quot;&lt;/head&gt;&quot;;
echo &quot;&lt;body&gt;&quot;;
echo &quot;&lt;h1&gt;コントローラーのテスト。サンプルテキスト。&lt;/h1&gt;&quot;;
echo &quot;&lt;/body&gt;&quot;;
echo &quot;&lt;/html&gt;&quot;;

} } [/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 &quot;&lt;html&gt;&quot;;
echo &quot;&lt;head&gt;&quot;;
echo &quot;&lt;meta charset=\&quot;UTF-8\&quot;&gt;&quot;;
echo &quot;&lt;title&gt;コントローラーのテスト&lt;/title&gt;&quot;;
echo &quot;&lt;/head&gt;&quot;;
echo &quot;&lt;body&gt;&quot;;
echo &quot;&lt;h1&gt;コントローラーのテスト。サンプルテキスト。&lt;/h1&gt;&quot;;
if ($a !== '') {
  echo &quot;&lt;p&gt;パラメータAは &quot; . $a . &quot;&lt;/p&gt;&quot;;
}
if ($b !== '') {
  echo &quot;&lt;p&gt;パラメータBは &quot; . $b . &quot;&lt;/p&gt;&quot;;
}
echo &quot;&lt;/body&gt;&quot;;
echo &quot;&lt;/html&gt;&quot;;

} [/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-&gt;autoRender = false;
echo &quot;&lt;html&gt;&quot;;
echo &quot;&lt;head&gt;&quot;;
echo &quot;&lt;meta charset=\&quot;UTF-8\&quot;&gt;&quot;;
echo &quot;&lt;title&gt;コントローラーのテスト&lt;/title&gt;&quot;;
echo &quot;&lt;/head&gt;&quot;;
echo &quot;&lt;body&gt;&quot;;
echo &quot;&lt;h1&gt;コントローラーのテスト。サンプルテキスト。&lt;/h1&gt;&quot;;
if ($a !== '') {
  echo &quot;&lt;p&gt;パラメータAは&quot; . $a . &quot;&lt;/p&gt;&quot;;
}
if ($b !== '') {
  echo &quot;&lt;p&gt;パラメータBは&quot; . $b . &quot;&lt;/p&gt;&quot;;
}
echo &quot;&lt;/body&gt;&quot;;
echo &quot;&lt;/html&gt;&quot;;

}

// setAction メソッドで呼び出される error アクション public function error() { $this->autoRender = false; echo "<html>"; echo "<head>"; echo "<meta charset=&quot;UTF-8&quot;>"; 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=&quot;UTF-8&quot;>"; 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 メソッドは同様にアクセスすることはできない。