1月 15th, 2008 admin 
Blog-side Akelosにしました
この記事を読んでしまったおかげで
CakePHPへの「あの配列地獄はなんなんとかならんのか」という違和感が不満へと変わってしまった
ということでAkelosに入門することにしてみる。
前書き
XAMPPでAkelosのテスト
・ユーザの管理をする
・ユーザにはそれぞれ管理者レベルみたいな属性がつく
こんなのを作りたいと思います。
ファイルを配置する
http://www.akelos.org/download
から最新版をダウンロード(0.8)
subversionからのインストールを薦めているけど、僕の環境ではなぜかチェックアウトが出来なかった。
今回はドキュメントルートの下にbasicというフォルダを作ってそこにそのまま配置した。

データベースを用意
あらかじめ3つのデータベースを作っておく、本番用、開発用、テスト用(ユニットテスト)
SQLiteが使えないXAMPPのPHP4なのでMySQLを使います。
CREATE DATABASE `basic` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `basic_dev` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `basic_tests` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
インストール
http://localhost/basic/
にアクセスしてインストーラを起動、

・DBの設定を入力
・言語の設定(関係ないかもしれないけどjaをenより前に移動した)

マイグレーションファイルを作成
RoRを使っていれば知っていると思うのですが、データベースのテーブルを作ったり、カラムを追加したりっていう作業ははマイグレーションという仕組みで管理します。
便利というよりは、この仕組みを使うことでスキーマの変更を必ずファイルに記録するようになるってのが個人的には嬉しいです。
app/installers/basic_installer.php
<?php
class BasicInstaller extends AkInstaller
{
function up_1(){
$this->createTable('users',
'id,'.
'email,'.
'password,'.
'authority_id,'.
'is_active'
);
$this->createTable('authorities',
'id,'.
'level,'.
'desctiption'
);
}
function down_1(){
$this->dropTables('users','authorities');
}
}
?>
こんなファイルを作ります。
up(次)とdown(前)の状態を記述することでデータベースのスキーマをバージョン管理できます。
さっそくupさせてみましょう
C:\xampp\htdocs\basic>php script/migrate Basic install
するとデータベースにusersとauthoritiesというテーブルが作成されています。

scaffold
C:\xampp\htdocs\basic>php script/generate scaffold user
C:\xampp\htdocs\basic>php script/generate scaffold authority

これで
http://localhost/basic/user/
や
http://localhost/basic/authority/
に一覧・追加・編集・削除・詳細表示ができる画面ができあがっています。
CakePHPでいうbakeですね。
リレーション
users.authority_idとauthorities.idを連携させます。
まず、モデルの設定から
model/user.php
<?php
class User extends ActiveRecord
{
var $belongs_to = 'authority';
}
?>
model/authority.php
<?php
class Authority extends ActiveRecord
{
var $has_many = 'users';
}
?>
user”s”って複数形になっているのに注意
次はコントローラー
controllers/user_controller.php
<?php
class UserController extends ApplicationController
{
var $models = 'user, authority';
function show()
{
$this->user = $this->User->find(@$this->params['id'], array('include' => 'authority'));
}
最後に入力フォーム
views/user/_form.tpl
<?php echo $active_record_helper->error_messages_for('user');?>
<p>
<label for="user_email">_{Email}</label><br />
<?php echo $active_record_helper->input('user', 'email')?>
</p>
<p>
<label for="user_password">_{Password}</label><br />
<?php echo $active_record_helper->input('user', 'password')?>
</p>
<p>
<label for="authority">_{Authority}</label><br />
<?=$form_options_helper->select('user', 'authority_id', $Authority->collect($Authority->find(), 'level', 'id'));?>
</p>
<p>
<label for="user_is_active">_{Is active}</label><br />
<?php echo $active_record_helper->input('user', 'is_active')?>
</p>
こんなんで連携してくれるようになる

CakePHPとの違い
・コントローラー名は複数形(users)だがURLは単数形になる
・has_manyのときは相手を複数形の名前で指定する必要があってはまった
次回は
本当にRoRと似てるなーと大枠をつかめたので次回はユーザ認証を作ってみたいと思います。