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

Controller ファイルを作成

「src」ディレクトリ内、「Controller」ディレクトリの中に「TestController.php」というファイルを作成。
以下のように記述する。

■場所:
\htdocs\chococake\src\Controller
■ファイル名
TestController.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>";
  }
}

以下のURLにアクセスする。
http://chococake.localhost/test

解説

「TestController」というクラスを作成」した。「Test」はCakePHPのアプリケーションの名前。
※アプリケーションは、コントローラーとモデルをセットにした最小単位。

アプリケーション名により、クラスは以下のように命名する。

アプリケーション名Controller

アプリケーション名が「test」であれば、「TestController」。
またそのファイル名も以下のように命名する。

アプリケーション名Controller.php

アプリケーション名が「test」であれば、「TestController.php」。

アプリケーション名は最初の文字を大文字にする。

今回、「test」というアプリケーションのコントローラーで、内部に「index」というアクションメソッドが用意されているため、以下のURLが生成される。

http://chococake.localhost/test/index

autoRender

$this->autoRender = false;

autoRender はページを自動的にレンダリングしレイアウトする機能。

今回はまだレイアウト用のテンプレートを用意していないため、「false」と「true」にすると「Error: The view for TestController::index() was not found.」と表示されエラーになる。

URLパラメータを使用する

アクセスするアドレスの形式は、ドメインの後に「アプリケーション名」と「アクション名」が指定される。

http://chococake.localhost/test/index

ドメイン「chococake.localhost」に、アプリケーション「test」とアクション「index」という形式になっていることが確認できる。

パラメータを渡す

「index」アクションに「testparam」というパラメータをアクションに渡すには、以下のようにする。

http://chococake.localhost/test/index/testparam

これで「index」アクションに「testparam」というパラメータが渡される。

パラメータは複数渡すことができ、以下のようにすれば「test1」「test2」というパラメータが受け渡される。

http://chococake.localhost/test/index/test1/test2

受け渡されたパラメータを表示させる

先程の「TestController.php」の「index」アクションを以下のように変更する。

■ファイル名
TestController.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>";
  }

解説

「test1」「test2」のパラメータをつけた URL にアクセス。

http://chococake.localhost/test/index/test1/test2

URL につけた「test1」「test2」のパラメータが取得できていることが確認できる。

index アクションの引数に $a $b を指定する。初期値は空にする。

public function index($a = '', $b = '')

引数が空でなかったら、if 文内の処理を実行する。

if ($a !== '') {
  echo "<p>パラメータAは " . $a . "</p>";
}

※パラメータBに関しても同様。

アクションの呼び出し

Controller 内には複数のアクションを用意することができる。

先程の「TestController.php」の「index」アクションを以下のように変更、さらに「error」アクションを追加する。

  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>";
  }

解説

「test1」「test2」のパラメータをつけた URL にアクセスすると以前と同様にパラメータの内容が表示され、パラメータがない、又はパラメータが1つのURL、例えば「http://chococake.localhost/test/index/test1」にアクセスすると「パラメータが無い、又は足りません」というテキストが表示される。

$a が空、又は $b が空の場合は setAction メソッドを呼び出し、error アクションを実行する。
setAction の後は return し、その後の処理は実行させない。

if ($a === '' || $b === '') {
  $this->setAction('error');
  return;
}

パラメータが無い、又は足りない場合に実行される 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>";
}

setAction メソッド

setAction メソッドが呼び出せるのは、この Controller に用意されているアクションのみ。
また、setAction は、何も出力されていない段階で実行するため、setAction の後は return し、その後の処理は実行させない。

return を記述しないと、setAction したアクションと、現在実行しているアクションが混じって、以下のように表示されてしまう。

アクションとメソッド

「アクション」「アクションメソッド」「メソッド」などの単語を使用してきたのでここで整理。

CakePHP の規約に以下のように記述がある。

コントローラーにある public メソッドは、アクションとしてブラウザーからアクセス可能になります。 例えば、 /users/view は UsersController の view() メソッドにアクセスします。 protected メソッドや private メソッドはルーティングしてアクセスすることはできません。

引用元:CakePHP の規約

つまり、Controller 内での public メソッドは、上記の例であればブラウザから「/index」「/error」などとしてアクセスすることができる。public メソッド = アクション、アクションメソッド。

しかし本講座に出てきてはいないが、protected メソッドや private メソッドは同様にアクセスすることはできない。

CakePHP の一覧