1 Akelos フレームワークを使用して簡単なアプリケーションを作成する
2 =========================================================
5 --------------------------
7 このチュートリアルでは、Akelosフレームワークを使用したアプリケーションを作成方法を説明します。
9 アプリケーションは書籍や著者を管理し、**booklink**と名づけます。
12 ---------------------------
14 - MySQL または SQLite データベース
19 この設定は多くのLinuxやホスティング事業者で見うけられます。Akelosは、このチュートリアルのおいてはこのように指定された設定上に限定しますが、どのような設定でも動作します。
22 ---------------------------
23 バージョン1.0に到達するまでの間は、Akelosのtrunkバージョンを取得することを強く推奨します。[subversion](http://subversion.tigris.org/)がインストールされていなければなりません。
24 Akelosのソースコードのコピーをチェックアウトするには、次のコマンドを使用します:
26 svn co http://svn.akelos.org/trunk/ akelos
28 subversionからコードをチェックアウトできない、またはしたくない場合は、[最新の安定版](http://www.akelos.org/akelos_framework-dev_preview.tar.gz)を取得できます。これは継続的な統合システムによって自動的に生成され、次のように実行することでそれを解凍します:
30 tar zxvf akelos_framework-dev_preview.tar.gz;mv akelos_framework-dev_preview akelos
32 さて、akelosが使用しているPHPのバージョンを見つけることができるかを確かめる必要があります。
38 PHP 5.1.2 (cli) (built: Jan 17 2006 15:00:28)
39 Copyright (c) 1997-2006 The PHP Group
40 Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
42 正しい状態ですので、続いてAkelosアプリケーションを作成することができます。もしそうでない場合は、PHPバイナリへのパスを見つける必要があります。通常は、次のようにします。
46 さらに、次のファイル(`script/console`, `script/generate`, `script/migrate`, `script/setup`, `script/test`)の先頭にある `#!/usr/bin/env php` をPHPのバイナリのパスに変更します。
48 **Windowsユーザへの注意 :** 次のように php.exe ファイルへのフルパスを使用してアプリケーションディレクトリからスクリプトをコールする必要があります:
50 C:\Program Files\xampp\php\php.exe ./script/generate scaffold
52 新規Akelosアプリケーーションのセットアップ
53 ---------------------------------------------
55 Akelos をダウンロードしたら、コンソールから PH Pスクリプトを実行できるでしょう。(Akelos を実行する必要はありませんが、このチュートリアルでは必要です。)
59 1. 異なるフォルダに Akelos アプリケーションを作成し、フレームワークライブラリへアプリケーションをリンクする
60 2. セキュリティの観点からこのフォルダからアプリケーションをコーディングし始め、サイトの訪問者に対してアプリケーションのモデル、ビュー、サードパーティライブラリ等を有効にする。
63 すでに推測されていると思いますが、最初のオプションを使用してリンクされたAkelosアプリケーションを作成します。これは世界への公開フォルダを提供するだけです。フレームワークのパスを変更することは、Akelosでは本当に簡単です。しなければならないことは、各コンポーネントが配置される場所を設定ファイルに定義するだけです。しかし、将来のチュートリアルでは設定ファイルを配布するアプリケーションをデザインすることでこれをやめる予定です。
65 `HOME_DIR/akelos` にフレームワークをダウンロードし、カレントが`akelos`ディレクトリであると仮定します。次のコマンドを実行して新しいアプリケーションで設定するための有効なオプションをチェックします。
69 インストーラで有効なオプションが表示されます。
71 Usage: setup [-sqphf --dependencies] <-d>
73 -deps --dependencies Includes a copy of the framework into the application
75 -d --directory=<value> Destination directory for installing the application.
76 -f --force Overwrite files that already exist. (false)
77 -h --help Show this help message.
78 -p --public_html=<value> Location where the application will be accesed by the
80 -q --quiet Suppress normal output. (false)
81 -s --skip Skip files that already exist. (false)
83 次にこのコマンドを実行します:(`/wwwh/htdocs`はあなたのウェブサーバ公開パスに置き換えてください。共有サーバでは`/home/USERNAME/public_html`が使用されます)
85 ./script/setup -d HOMEDIR/booklink -p /www/htdocs/booklink
87 This will create the following structure for the **booklink** application:
88 これは次のような構造をした**booklist**アプリケーションを作成します:
91 app/ << コントローラ、ビュー、モデル、インストーラを含むアプリケーション
92 config/ << 退屈な設定ファイル (ウェブ経由で設定します)
93 public/ << これは単なるフォルダで/www/htdocs/bboklist下でソフトリンクとして公開されます
94 script/ << コード生成やテスト実行のためのユーティリティ
96 **Windowsユーザは注意:** booklink/publicへのソフトリンクは*NIXシステムについてのみ生成されます。そのため、ウェブサーバに`httpd.conf`ファイル上で次のように追加することで**booklink**アプリケーション用のpublicパスを伝える必要があります。
98 Alias /booklink "/path/to_your/booklink/public"
100 <Directory "/path/to_your/booklink/public">
101 Options Indexes FollowSymLinks
109 ### アプリケーション用のデータベースを作成する ###
111 次に必要なことは、アプリケーション用のデータベースを作成することです。PHP5でSQLiteを使用しようとしている場合はこの章を飛ばしてください。
113 MySQLデータベースを作成することは、このチュートリアルの範囲外ですので、ご自身のシステム上での作成方法をググルか、またはこの一般的なシナリオを試してください。それぞれの異なる環境について3つの異なるデータベース(production, development, testing)を作成できます。
117 mysql> CREATE DATABASE booklink;
118 mysql> CREATE DATABASE booklink_dev;
119 mysql> CREATE DATABASE booklink_tests;
121 mysql> GRANT ALL ON booklink.* TO bermi@localhost IDENTIFIED BY "pass";
122 mysql> GRANT ALL ON booklink_dev.* TO bermi@localhost IDENTIFIED BY "pass";
123 mysql> GRANT ALL ON booklink_tests.* TO bermi@localhost IDENTIFIED BY "pass";
125 mysql> FLUSH PRIVILEGES;
128 もし共有サーバである場合は、ホスグィング会社の操作パネルから作成する必要があるかもしれません。
132 #### ウェブインストーラを使用する ####
134 http://localhost/booklink であなたのアプリケーション設定ウィザードを見ることができます。
136 ウィザードの次のステップはデータベース、ロケール、ファイルパーミッションを設定し、設定ファイルを生成します。そうしている間コーヒーでも飲みましょう。そうすると**booklink**アプリケーションを作成できます。
138 #### 手動で設定ファイルを編集する ####
140 `config/DEFAULT-config.php` や `config/DEFAULT-routes.php` というファイルは、`config/config.php` や `config/routes.php` として保存し、必要に応じて次のように編集します。
142 `public/.htaccess`ファイルを編集して、次のようなRewriteBaseを設定することで賢いURLを使用したい場合は、手動でbase rewrite パスを設定する必要があるかもしれません。
144 RewriteBase /booklink
146 アプリケーションを正常にインストールした後で、http://localhost/booklink でウェルカムメッセージが見えるでしょう。そうしたらフレームワークセットアップファイル(`/config/config.php` ファイルが存在する場合はアクセスできないでしょう)を安全に削除することができます。
149 ---------------------------------
151 さて、テーブルとカラムを定義する必要があります。そこにアプリケーションが本と著者についての情報を保持します。
153 他の開発者と作業する際に、データベースが変更されるためそれぞれに異なったものが配布されます。Akelosはこの問題に対する解決法があります。それは*インストーラ*または*マイグレーション*と名づけられています。
155 それではインストーラを使用してデータベースを作成してみましょう。その時々にbooklinkデータベーススキーマに対して行った変更を配信することができます。
156 *インストーラ*を使用することで、データベースのテーブルやカラムをデータベースベンダから独立して定義することができます。
158 では、次のインストーラコードを使用して`app/installers/booklink_installer.php` という名前のファイルを作成します。
162 class BooklinkInstaller extends AkInstaller
166 $this->createTable('books',
168 'title,'. // the title of the book
169 'description,'. // a description of the book
170 'author_id,'. // the author id. This is how Akelos will know how to link
171 'published_on' // the publication date
174 $this->createTable('authors',
176 'name' // the name of the author
181 $this->dropTables('books','authors');
187 これだけでAkelosにとってはデータベーススキーマを作成するには十分です。カラム名を指定する場合は、Akelosはデータベース標準規約に基づいて最もベストなデータ型をデフォルトとします。テーブル設定において完全な制御をしなければならない場合は、[php Adodb データディクショナリ構文](http://phplens.com/lens/adodb/docs-datadict.htm)を使用することができます。
189 次にコマンドを使用してインストーラを実行する必要があります。
191 ./script/migrate Booklink install
193 それからトリックを使用します。MySQLを使用する場合は、データベースは次のようになるでしょう:
197 +--------------+--------------+------+-----+----------------+
198 | Field | Type | Null | Key | Extra |
199 +--------------+--------------+------+-----+----------------+
200 | id | int(11) | NO | PRI | auto_increment |
201 | title | varchar(255) | YES | | |
202 | description | longtext | YES | | |
203 | author_id | int(11) | YES | MUL | |
204 | published_on | date | YES | | |
205 | updated_at | datetime | YES | | |
206 | created_at | datetime | YES | | |
207 +--------------+--------------+------+-----+----------------+
211 +--------------+--------------+------+-----+----------------+
212 | Field | Type | Null | Key | Extra |
213 +--------------+--------------+------+-----+----------------+
214 | id | int(11) | NO | PRI | auto_increment |
215 | name | varchar(255) | YES | | |
216 | updated_at | datetime | YES | | |
217 | created_at | datetime | YES | | |
218 +--------------+--------------+------+-----+----------------+
222 ------------------------------------------------------
224 Akelosはアプリケーションの形成において[MVC デザインパターン](http://en.wikipedia.org/wiki/Model-view-controller)に基づいています。
226 ![Akelos MVC 図](http://svn.akelos.org/trunk/docs/images/akelos_mvc.png)
228 ### アプリケーションのファイルとAkelos命名規約 ###
230 Akelosに「設定よりも規約」という哲学を付与する規約があります。
234 * **パス:** /app/models/
235 * **クラス名:** 単数形, キャメルケース *(BankAccount, Person, Book)*
236 * **ファイル名:** 単数形, アンダースコア *(bank_account.php, person.php, book.php)*
237 * **テーブル名:** 複数形, アンダースコア *(bank_accounts, people, books)*
241 * **パス:** */app/controllers/*
242 * **クラス名:** 単数形 または 複数形, キャメルケース, `Controller`で終わる *(AccountController, PersonController)*
243 * **ファイル名:** 単数形 または 複数, アンダースコア, `_controller`で終わる *(`account_controller.php`, `person_controller.php`)*
247 * **パス:** /app/views/ + *underscored_controller_name/* *(app/views/person/)*
248 * **ファイル名:** アクション名, 小文字 *(app/views/person/show.tpl)*
252 ------------------------------------------
254 Akelosはコードジェネレータを付属しており、完全に機能的なスキャフォールドコードを生成することによって開発時間を短縮することができます。出発点/学習ポイントとして使用することができます。
256 ### スキャフォールドジェネレータを使用する ###
258 **booklink**データベースを作成する前に対話的に基本となる骨組みを生成します。この骨組みをすばやく取得するために、次のような*スキャフォールドジェネレータ*を使用することができます。
260 ./script/generate scaffold Book
264 ./script/generate scaffold Author
266 これは実際に動作するコードを含んだファイルやフォルダを生成します。信じられませんか?自分でやってみてください。ブラウザで[http://localhost/booklink/author](http://localhost/booklink/author) や [http://localhost/booklink/books](http://localhost/booklink/books)を開いて、著者や書籍を追加できます。レコードをいくつか作成し、フードの下に何があるかを説明している部分に戻ってください。
269 ------------------------------------------
271 これは、`http://localhost/booklink/book/show/2`というURLをコールしたときのワークフローの簡単な説明です。
273 1. Akelos はリクエストを3つのパラメータに分解します。これは`/config/routes.php`ファイル(この後に詳しく説明します)の内容に従います。
278 2. 一度Akelosがこのリクエストを処理すると、`/app/controllers/book_controller.php`ファイルを検索します。もし見つかれば、`BookController`クラスをインスタンス化します。
280 3. コントローラはリクエストから`controller`変数にマッチするモデルを検索します。この場合、`/app/models/book.php`を検索します。見つかれば、コントローラの`$this->Book`属性にモデルのインスタンスを生成します。`id`がリクエストに存在すれば、データベースからidが2の書籍を検索し、`$this->Book`のままです。
282 4. 有効であれば、`BookController`クラスから`show`アクションをコールします。
284 5. 一度showアクションが実行されると、コントローラは`/app/views/book/show.tpl`ビューファイルを検索します。結果を描画し`$content_for_layout`変数に格納します。
286 6. Akelosは`/app/views/layouts/book.tpl`のようなコントローラと同じ名前のレイアウトを検索します。もし見つかれば、`$content_for_layout`に内容を挿入してレイアウトを描画し、ブラウザに出力を送信します。
288 これはAkelosがリクエストを処理する方法を理解するのに役立ちます。そのため、ベースアプリケーションを変更します。
291 ----------------------------
293 それではauthorsテーブルとbooksテーブルを関連付けてみましょう。これを保管するために`author_id`カラムを使用しますので、データベースに追加します。
295 テーブルがどのようにお互いに関連しているかをモデルに教える必要があります。
297 */app/models/book.php*
301 class Book extends ActiveRecord
303 var $belongs_to = 'author'; // <- declaring the association
308 */app/models/author.php*
312 class Author extends ActiveRecord
314 var $has_many = 'books'; // <- declaring the association
319 モデルはお互いに注意してください。bookコントローラを修正する必要があります。そうすると`author`と`book`モデルインスタンスが導入されます。
321 */app/controllers/book_controller.php*
325 class BookController extends ApplicationController
327 var $models = 'book, author'; // <- make these models available
329 // ... more BookController code
333 // Replace "$this->book = $this->Book->find(@$this->params['id']);"
334 // with this in order to find related authors.
335 $this->book = $this->Book->find(@$this->params['id'], array('include' => 'author'));
338 // ... more BookController code
341 次のステップは、本を作成または編集したときに有効な著者テーブルを表示することです。これは`$form_options_helper`を使用して*/app/views/book/_form.tpl* ファイルの `<?=$active_record_helper->error_messages_for('book');?>` の後ろの右に次のようなコードを挿入することでできます。
344 <label for="author">_{Author}</label><br />
345 <?=$form_options_helper->select('book', 'author_id', $Author->collect($Author->find(), 'name', 'id'));?>
348 まだ著者テーブルを追加指定ない場合は、すぐに作成してhttp://locahost/boolink/book/add を開き、選択リストから新しい著者をチェックしてください。リストから著者を選択して新しい本を追加します。
350 著者が保存されたように思えますが、`app/views/book/show.tpl`ビューには含まれていません。`<? $content_columns = array_keys($Book->getContentColumns()); ?>`の後の右にこのコードを追加してください。
352 <label>_{Author}:</label> <span class="static">{book.author.name?}</span><br />
354 めったにない`_{Author}`や`{book.author.name?}`構文についてカナキリ声をあげたにちがいありません。それは実際に[Sintags](http://www.bermi.org/projects/sintags)のルールであり、キレイにビューを記述するのに役立ちます。また、標準のPHPにコンパイルされます。
360 これがすべてです。徐々にこのチュートリアルを改良していて、足りない特徴を追加します。他の文書は次のようなものです:
377 Translated by: bobchin