はじめまして。松藤と申します。公私共にほとんどブログを書いたことがないので、最初に簡単に自己紹介します。

アイテマンではPiece Frameworkを中心に事業を展開しているわけですが、筆者はPiece_IDEというEclipseで動作するPiece Frameworkのための統合開発環境の開発を担当しています。今Piece Frameworkは大きな転換期を迎えており、今後2~3年のうちに実装すべきプロダクトに向けて、研究と実装の日々を送っています。

さて、普段アプリケーションを開発するときには当然Piece Frameworkを使用するのですが、今回は12月12日に行われますCakePHP関西勉強会に参加するので、少しは勉強しておこうということでCakePHPについて書きたいと思います。

MATSUFUJI Hideharu

Piece Frameworkではおなじみのユーザ登録アプリケーションRegistration ExamplesCakePHPで実装することにします。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:
コメント