自分も始めたばかりなので備忘録兼チュートリアルとして残しておく。
controllerについて
MVCフレームワークについては前回触れたと思うが、全部が全部必須ってわけではない。
modelはDB接続しなければ必要ないし、Viewに関してもphp関数で無理やり画面に出力されてしまうなら不要になる。
しかし、controllerに関しては必須で必要になる。
ということで、controllerからやっていく。
controllerは下記ディレィトリ上に.phpファイルを作成するとスクリプトが自動的に読み取ってくれる。
app/Controller/
そして、作成するphpファイルには命名規約がある。
自動的に読み取るために名前をつけるルールが決まっているという訳だ。
アプリケーション名Controller.php
このアプリケーション名というのは作成する「MVC」がワンセットになったプログラムのかたまりのこと。
試しに、sampleというアプリケーションを作成する場合は
SampleController.php
というファイル名になる。
キャメル記法で作成を採用しているので大文字小文字もこれに合わせること。
アクションについて
コントローラーは、「いくつかのアクションをひとまとめにして管理し処理するもの」。
「アクション」というのは、これはとりあえず「Webページ」のことだ、と考えておけばおk。
つまり、コントローラーとは、複数のページをアクションという形でまとめて管理する働きをするもの。
例えば、簡単なデータを管理するWebアプリを考えてみると、
データを追加したり削除したり、編集したり、検索をしたりといったさまざまなページを用意することになるはず。
これらをひとまとめにして管理するのがcontroller。
アクションに関してはURLで明示的に指定できる。
http://ドメイン/CakePHPのディレクトリ/アプリケーション/アクション
controllerのクラス定義
<?php
App::uses('AppController', 'Controller');
class コントローラー名 extends AppController {
public function アクション名() {
……ここに処理を書く……
}
}
最初にある「App::uses」というのは、CakePHPに用意されているライブラリをロードするためのもの。
CakePHPではさまざまな機能が用意されてて、それらを利用する場合にこれを使う。書き方は以下。
App::uses( クラス名 , パッケージ名 );
コントローラークラスは、Controllerパッケージにある「AppController」というクラスを継承して作成する。
このため、まず最初にApp:usesでこのクラスを使えるようにしておく。
SampleControllerを作ってみる。
<?php
App::uses('AppController', 'Controller');
class SampleController extends AppController {
public function index() {
$this -> autoRender = false;
echo "<html><head></head><body>";
echo "<h1>サンプルページ</h1>";
echo "<p>これがサンプルのページです。</p>";
echo "</body></html>";
}
}
これを下記に配置。
cake/Controller/SampleController.php
保存したら下記にアクセス。
http://localhost/[cakephpディレクトリ]/sample/
おそらく下記のような画面が表示されるはず。
本来ならindexアクションにアクセスするには「〇〇/sample/index」となるはずだが、CakePHPではindexがデフォルトのアクションに設定されていて、
アクション名が省略されると自動的にindexアクションにアクセスしたものとみなされる。
今回作成したindexアクションのメソッドを見てみるとアクションメソッドは、以下のような形で定義されてる。
public function アクション名() {
……実行する処理……
}
引数は今回、何も用意されていないがアクションによっては利用する場合もある(これは後述)。実行している処理は、基本的にechoでHTMLのタグを書き出しているだけの単純なもの。
$this -> autoRender = false;
これの意味を解説するとViewはつかわないぜってこと。
MVCでは表示はViewに頼ってるから、今回はViewじゃないよって感じ。
リダイレクト
ちなみにコントローラーにアクションメソッドを用意すればどんどん増やしていくことができたり。アドレスをきちんと指定しさえすれば、いくつものページを用意することができたり。わかるよね。
<?php
App::uses('AppController', 'Controller');
class SampleController extends AppController {
public function index() {
$this -> autoRender = false;
$this->redirect("./other/");
}
public function other(){
$this -> autoRender = false;
echo "<html><head></head><body>";
echo "<h1>サンプルページ</h1>";
echo "<p>これはもう1つのページです。</p>";
echo "</body></html>";
}
}
※別のアクションへのフォワード
public function index() {
$this -> autoRender = false;
$this->setAction("other");
}
indexアクションにアクセスすると、otherアクションにリダイレクトしたはず。アドレスを見ると、/sample/otherに変わっているはず。
$this->redirect( アドレス );
これでリダイレクト。
アドレスさえちゃんと指定すればどのサイトにもリダイレクト可能。
フォワードのほうでやると密かにリダイレクトされた形になる。
値の受け渡し
<?php
App::uses('AppController', 'Controller');
class SampleController extends AppController {
public function index() {
$this -> autoRender = false;
$date = new DateTime();
$date->setTimeZone(new DateTimeZone('Asia/Tokyo'));
$str = $date->format("H:i:s");
$this->redirect("./other/" . urlencode($str));
}
public function other($param){
$this -> autoRender = false;
$str = urldecode($param);
echo "<html><head></head><body>";
echo "<h1>サンプルページ</h1>";
echo "<p>これはもう1つのページです。</p>";
echo "<p>送られた値: " . $str . "</p>";
echo "</body></html>";
}
}
$this->redirect("./other/" . urlencode($str));
/other/の後に、渡したい値をURLエンコードしてつけている。
public function other($param){……
受け取る側は引数に$paramという変数を用意。
複数渡したい時は下記のようにする。
$this->redirect("./other/abc/xyz/123”);
↓
public function other($a, $b, $c){……
これで**$a = “abc”, $b = “xyz”, $c = “123”**が保持される。
最後に
今回はcontrollerについて書いたので、次回はViewについて書く。