2012-08-13 23:40:49

CakePHPを利用した簡単アプリケーション開発 ~ ViewとControllerに触れる

テーマ:CakePHP

前回、CakePHPをインストール したので早速アプリケーション開発に取り掛かっていきます。

フレームワークを使った開発といってもそれほど難しいものではありません。

構造と作り方のルールを最初に覚えてしまえば、開発は効率的に行えると思います。



CakePHPのディレクトリ構造


CakePHPはMVCモデルを採用しており、その構造もそれぞれのディレクトリに分かれています。

確認するディレクトリは主に、CakePHPのソースファイル内にあるappディレクトリです。


$ ls app/
Config   Controller  Locale  Plugin  Vendor  index.php  webroot
Console  Lib         Model   Test    View    tmp


見ればわかるのですが、Model、View、Controllerというディレクトリがあり、それぞれ対応するファイルを配置していきます

ModelはDB関連の設定ファイルを、ViewはHTML用のテンプレートを、Controllerはビジネスロジックを組み立てていきます。

もちろん、共通で使うようなライブラリを配置するディレクトリなどもありますが、最低限アプリケーションを作るうえでは必須ではないので、今回の解説からは一旦除きます。


今回の説明の中でもう1つ重要なディレクトリがConfigディレクトリです。

こちらは、CakePHPの設定ファイルが一式入っていますので、設定ファイルの編集といえばこの中にあるファイルを変更していきます。



CakePHPのControllerを作る


まずは、Controllerディレクトリの中身を見て行きます。

CakePHPをインストールした直後の初期状態では、AppController.phpとPagesController.phpという2つのファイルがあるかと思います。

このうち、AppController.phpはCakePHPの基本ファイルになるので何も触らずにそのままにしておきます。

PagesController.phpは、CakePHPの初期ファイルを制御しているプログラムですので、まずはこの中身を見て行きましょう。


<?

class PagesController extends AppController {

/**
 * Controller name
 *
 * @var string
 */
    public $name = 'Pages';

/**
 * This controller does not use a model
 *
 * @var array
 */
    public $uses = array();

/**
 * Displays a view
 *
 * @param mixed What page to display
 * @return void
 */
    public function display() {
    }
}

まず、クラスファイル名は好きに命名できますがCakePHPのルールでは複数形を採用することになっています。(複数形にしなくても動くのですが、そういうルールになっているので基本従いましょう)

単語を複数形(今回の場合はPages)にして、それにController.phpを付けます。

クラスファイル自体も同様です。


最初にメンバ変数$nameを定義していますが、これはコントローラーの名前でクラス名に採用した単語と同様のものをセットします。

次にメンバ変数$usesを定義しますが、これはモデルを利用する際にそのモデル名を配列でセットしていきます。

このクラスの中ではモデルは利用しない(そして、解説は次回のエントリに持ち越します)ので空の配列を指定しています。


最後のdisplayメソッド(アクション)ですが、これは自由に定義できます。

最初になにやら処理が埋め込まれていますが、displayメソッドの中身を一旦クリアして、下記のように書いて見ます。


public function display() {
    $this->set('string', 'Hello World');
    $this->render('display');
}


何をやっているかというと、AppControllerで定義されているsetメソッドを使い、View側にstringという名前の変数を渡せるように定義し、その中身に「Hello World」をセットしています。

次に、同じくrenderメソッドでView側のdisplayという名前のテンプレートファイルを呼び出すように定義しています。

これがdisplayアクションとして定義され、好きな処理の数だけアクションをメソッドとしてコントローラーに定義していきます。



CakePHPのViewを作る


一旦、Controllerから離れてView側のファイルを作ります。


$ ls
Elements  Emails  Errors  Helper  Layouts  Pages  Scaffolds

Viewディレクトリの中には、さらに多くのディレクトリがありますが、この中でまず確認するのは先ほど編集したPagesコントローラと同じディレクトリ名であるPagesディレクトリです。

ControllerとViewの関係はこのように同一の名前で紐付けられています


Pagesディレクトリの中身を見てみると、home.ctpという名前のテンプレートファイルがありますが、これはCakePHPの初期画面を表示するためのテンプレートファイルなので一旦無視します(削除してもかまいません)。

Pagesディレクトリに、先ほどControllerで呼び出すことにしている、display.ctpというファイルを作ります。

拡張子は、ctpとなるのでそのルールに沿ってファイル名を定義します。


<?php echo $string; ?>


Viewファイルの中身は、基本的にHTMLとして書けますが、処理を加えたい場合は上記のようにPHPのタグを書くことでその中身はPHPと同様にロジックが記述できます。

そして、echo処理している$stringは、先ほどControllerでセットしたstring変数の中身が入ってきます。

これで、ブラウザからアクセスしてみると


A Day In The Boy&#39;s Life-CakePHPでアプリケーション開発-1


というように、画面に「Hello World」の文字列が表示されているかと思います。
ちなみに、Controller側で定義するrenderメソッドを使ったテンプレートファイルの指定は、基本的に必要ありません。

デフォルトでアクション名と同じテンプレートファイルが呼び込まれます

ですので、アクション名と異なるテンプレートファイルを呼び出したい(例えば、複数の処理で共通で呼び出すテンプレートファイルがあるとか)場合は、


$this->render('hoge');

のように、異なるテンプレートファイルを呼び出す(上記の場合はhoge.ctp)ことを明示しますが、それ以外の場合はわざわざ定義する必要はありません。



CakePHPのURL構造


ここまでが、ごくごく基本的なCakePHPを使ったアプリケーション開発のフローです。

最後に疑問になってくるのが、何でブラウザからアクセスするだけで、Pagesコントローラーとdisplayアクションが呼び出されるかという部分です。


CakePHPのURL構造は、基本的(というのはURL構造は変更できるため初期の状態としては)に下記のようになってきます。


http(s)://ドメイン名/コントローラー名/メソッド名/パラメータ1/パラメータ2/・・・


ということなので、先ほど作ったHello Worldの画面を出すためには


http://www.example.com/pages/display/


というURLからでもアクセスが可能です。

なぜ、コントローラ名とアクション名をURLに付けなくてもPagesコントローラーとdisplayアクションが呼び出されるのかというと、CakePHPの設定ファイルであるroutes.phpにてその定義がされているからです。


/**
 * Here, we are connecting '/' (base path) to controller called 'Pages',
 * its action called 'display', and we pass a param to select the view file
 * to use (in this case, /app/View/Pages/home.ctp)...
 */
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
/**
 * ...and connect the rest of 'Pages' controller's urls.
 */
    Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

最初の、Router::connectで/でアクセス(ドメイン名やIPアドレスだけ)した場合に呼び出すコントローラーとアクション名を定義しています。
第3引数のhomeはパラメータ名です。


次の、Router::connectは/pages/にアクセスした場合の挙動を定義しています。

実際この定義があるためにアクション名を省いた、http://www.example.com/pages/ というURLにアクセスしてみてもdisplayアクションが呼び出されます。

CakePHPのルーティングの設定は掘り下げていくとかなり深くなるので、別の機会にまとめたいと思います。


ここまでが、CakePHPを使った基本的なアプリケーション開発の流れです。

今後、違うエントリでもう少し掘り下げていきたいと思います。





コメント

[コメントをする]

コメント投稿

AD

Amebaおすすめキーワード

Ameba人気のブログ

Amebaトピックス

ランキング

  • 総合
  • 新登場
  • 急上昇