カテゴリー
コンピューター

CakePHP2 のアクションの基本と移動について調べたよ♪

入門!CakePHP の一番簡単なサンプルを試します♪ | oki2a24 の続きの投稿となります。

今回はアクションについてと、プログラム内で別のアクションに移動する方法2つを調べました。

アクションとは?まとめ

  • コントローラーの関数がアクションメソッド
  • URL に、「コントローラー/アクションメソッド」と入力することでアクションメソッドが実行される。ちなみにアクションメソッドの後に「/」を加えても同じ結果。

前提

  • CakePHP 2.1.3 導入済み。
  • ドキュメントルート/cake/sample/(ここにCakePHP が入ってます。app ディレクトリとか、.travis.yml ファイルとか。)

ソース

cake/sample/app/Controller/HaskapController.php

<?php

class HaskapController extends AppController {

	// コントローラー名
	public $name = 'Haskap';
	// モデルを指定しない
	public $uses = null;
	// ビューを使わないように設定
	public $autoRender = false;

	public function index() {
		echo "こんにちはっ!ハスカップだよっ!";
	}

	public function other() {
		echo "こんにちはっ!other関数だよっ!";
	}

}

?>

実行結果

http://localhost/cake/sample/haskap/other と入力することで、other メソッドの「こんにちはっ!other関数だよっ!」が表示されました。URL の後に「/」を試しに加えてみましたが、同じでした。

ちなみに、 http://localhost/cake/sample/haskap/ で「こんにちはっ!ハスカップだよっ!」が表示されますが、index メソッドを明示的に指定して http://localhost/cake/sample/haskap/index でも同様でした。また、これも URL の後に「/」を試しに加えてみたところ、やはり同じ結果でした。

さて、次の勉強です。どんどん行きましょう。

プログラム内で別のアクションに移動する方法2つまとめ

  • $this->setAction( アクション名 );  指定されたアクションメソッドの中身をこっそり実行するような感じです。URL は変わりません。
  • $this->redirect( 移動先アドレス ); ブラウザのアドレス欄に移動先アドレスを勝手に打ち込んでそこに強制的にアクセスするような感じです。外部サイトでも OK です。

ソース

ひとつずつコメントをはずして実行してみました。

cake/sample/app/Controller/HaskapController.php

<?php

class HaskapController extends AppController {

	// コントローラー名
	public $name = 'Haskap';
	// モデルを指定しない
	public $uses = null;
	// ビューを使わないように設定
	public $autoRender = false;

	public function index() {
		echo "こんにちはっ!ハスカップだよっ!";
		//$this->setAction("other"); // フォワード
		//$this->redirect("./other"); // リダイレクト
		//$this->setAction("http://google.co.jp"); // フォワード
		//$this->redirect("http://google.co.jp"); // リダイレクト
	}

	public function other() {
		echo "こんにちはっ!other関数だよっ!";
	}

}

?>

結果を見て見ましょう。すべて http://localhost/cake/sample/haskap/ へのアクセスです。

$this->setAction(“other”); の場合の実行結果

  • ブラウザのURL http://localhost/cake/sample/haskap/ のまま
  • 画面への表示 「こんにちはっ!ハスカップだよっ!こんにちはっ!other関数だよっ!」

index アクションメソッドの後に、other アクションメソッドが実行されています。URL は変化なしなので、まるで other メソッドがこっそり実行されたかのようです。

$this->redirect(“./other”); の場合の実行結果

  • ブラウザのURL http://localhost/cake/sample/haskap/other に変化
  • 画面への表示 「こんにちはっ!other関数だよっ!」

今度は other アクションを呼び出したときとなんら変わらない結果となりました。まるで index アクションなどなかったかのようです。

ですが実際は index メソッドが実行された後に、other アクションが呼び出されたのだと思います。

$this->setAction(“http://google.co.jp”); の場合の実行結果

  • ブラウザのURL http://localhost/cake/sample/haskap/ のまま
  • 画面への表示↓
    こんにちはっ!ハスカップだよっ!
    Warning (2): call_user_func_array() expects parameter 1 to be a valid callback, class ‘HaskapController’ does not have a method ‘http://google.co.jp’ [CORE\Cake\Controller\Controller.php, line 869]

エラーになりました。HaskapController に http://google.co.jp なんてアクションメソッドは見つからなかったよ!と怒られました。

$this->redirect(“http://google.co.jp”); の場合の実行結果

  • ブラウザのURL https://www.google.co.jp/ に変化
  • 画面への表示 外部サイト Google 日本に移動しました。

今回もまるで index アクションなどなかったかのようでした。外部サイトである、あの Google へジャンプしました。

おわりに

別のアクションに移動する方法2つは、使い分けがピンときているようで、あとちょっと、いまいちわかっていないような感じです。具体的なアプリのコードを見たら、あぁ!ってきっとなるのだと思います。早く出会いたいです。