はじめまして。松藤と申します。公私共にほとんどブログを書いたことがないので、最初に簡単に自己紹介します。
アイテマンではPiece Frameworkを中心に事業を展開しているわけですが、筆者はPiece_IDEというEclipseで動作するPiece Frameworkのための統合開発環境の開発を担当しています。今Piece Frameworkは大きな転換期を迎えており、今後2~3年のうちに実装すべきプロダクトに向けて、研究と実装の日々を送っています。
さて、普段アプリケーションを開発するときには当然Piece Frameworkを使用するのですが、今回は12月12日に行われますCakePHP関西勉強会に参加するので、少しは勉強しておこうということでCakePHPについて書きたいと思います。
Piece Frameworkではおなじみのユーザ登録アプリケーションRegistration ExamplesをCakePHPで実装することにします。Registration Examplesはよくある登録ページ、確認ページ、完了ページを持つ小さなアプリケーションです。
最初にCakePHPのサイトから最新版(1.2.0.7692 RC3)をダウンロードし、Bakeを使ってプロジェクトを生成します。
cd cake_1.2.0.7692-rc3/cake/console ./cake bake project
筆者はPHPの開発もEclipseで行っているので、作成したプロジェクトをEclipseでインポートできるようにするためトップディレクトリに.projectファイルを配置します。また、同じ方法でCakePHP本体もEclipseから参照できるようにします。
CakePHPは"Convention over Configuration (CoC)"(設定に勝る規約)という考えに基づいて設計されています。そこで今回は設定は変更せずに規約ベースで実装することにします。まずコントローラを実装します。今回はユーザを登録するということで、UsersContollerクラスとします。コントローラのクラス名の規約は複数形に"Controller"を付加したものです。
controllers/users_controller.php
<?php
class UsersController extends AppController
{
var $name = 'Users';
var $uses = false;
function form() {}
function validation()
{
$this->User->set($this->data);
if ($this->User->validates()) {
$this->render('confirmation');
} else {
$this->render('form');
}
}
function exitConfirmation()
{
if (!empty($this->params['form']['reedit'])) {
$this->render('form');
} else if (!empty($this->params['form']['register'])) {
// Registration
$this->render('finish');
}
}
}
CakePHPではhttp://www.example.com/cakes/buyというURIの場合、CakesControllerクラスのbuyメソッドが実行される規約になっています。UsersControllerクラスの各メソッドは、それぞれ/users/form, /users/validation, /users/exitConfirmationに対応しています。
続いてモデルを実装します。モデルのクラス名の規約は単数形です。今回はUserクラスにしました。CakePHPではコントローラは自身のクラス名の単数形を自動的にバインディングします。
models/user.php
<?php
class User extends AppModel
{
var $name = 'User';
var $validate = array ('firstName' => VALID_NOT_EMPTY,
'lastName' => VALID_NOT_EMPTY
);
var $useTable = false;
function schema($field = false)
{
$this->_schema = array();
return $this->_schema;
}
function getColumnType($column)
{
return null;
}
}
CakePHPのモデルはデータベースとの関連性が非常に強いため、今回のようなデータベースを使用しないアプリケーションでモデルを使うことは困難です。今回はuseTableプロパティをfalseに設定し、データベースにアクセスするschemaメソッド、getColumnTypeメソッドをオーバーライドすることで回避しました。
最後にビューです。ビューは登録ページのform.ctp、確認ページのconfirmation.ctp、完了ページのfinish.ctpを用意しました。
views/users/form.ctp
<?php echo $form->create('User', array('action' => 'validation')); ?>
<fieldset>
<legend>User Name</legend>
<p>
<?php echo $form->input('User.firstName'); ?>
</p>
<p>
<?php echo $form->input('User.lastName'); ?>
</p>
</fieldset>
<p>
<?php echo $form->submit('confirm'); ?>
</p>
<?php echo $form->end(); ?>
views/users/confirmation.ctp
<?php echo $form->create('User', array('action' => 'exitConfirmation')); ?>
<?php echo $form->hidden('User.firstName'); ?>
<?php echo $form->hidden('User.lastName'); ?>
<fieldset>
<legend>User Name</legend>
<p>
<?php echo $form->value('User.firstName'); ?>
</p>
<p>
<?php echo $form->value('User.lastName'); ?>
</p>
</fieldset>
<p>
<?php echo $form->submit('reedit', array('name' => 'reedit')); ?>
<?php echo $form->submit('register', array('name' => 'register')); ?>
</p>
<?php echo $form->end(); ?>
views/users/finish.ctp
<h3>Registration finished!</h3>
今回初めてCakePHPを使ってみました。どういった記事にするかを考えず実装してみましたが、ここまで書いてきて、CakePHPの規約を学習することがCakePHPを理解する近道だと感じました。規約をベースとした開発は初期の学習コストこそかかるものの、コード量や設定を削減できるというメリットがあります。Convention over Configurationという考えはCakePHPが高速開発フレームワークを謳う上でもっとも重要なコンセプトと言えるでしょう。
参考文献
トラックバック(0)
- このブログ記事のトラックバックURL:
