掲示板作成:データベースとの連携(1/3)
では、掲示板作成に取り掛かりましょう。前回同様、プロジェクトとアプリケーションの生成から入ります。今回は特にデータベースとの連携がありますので、MVCのM(モデル)部分にフォーカスします。
プロジェクトとアプリケーションの生成
- プロジェクト名:mysite
- アプリケーション名:keijiban
とし、プロジェクトとアプリケーションの生成を行います。
cd mysite symfony init-project mysite symfony init-app keijiban
前回同様、Apache 2.2の「httpd.conf」にもvirtualhost設定を加えておきます(もちろん「conf/extra/httpd-vhosts.conf」を参照する設定にしたうえで、こちらに追記しても構いません)。Apache 2.2やPHP 5.2のインストールフォルダは適宜読み替えてください。
<VirtualHost *:80> ServerName localhost DocumentRoot "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\mysite\web" DirectoryIndex index.php Alias /sf "C:\php\PEAR\data\symfony\web\sf" <Directory "C:\Program Files\Apache Software Foundation
\Apache2.2\htdocs\mysite\web"> AllowOverride All </Directory> <Directory "C:\php\PEAR\data\symfony\web\sf"> allow from all </Directory> </VirtualHost>
scaffolding機能による自動生成
アプリケーションの生成まで行ったところで、次にデータベースとの連携の準備を進めていきます。
databases.yml編集
プロジェクトのデータベース接続設定ファイルである「mysite/config/databases.yml」に以下を追記します。ユーザー名、パスワードは適宜書き換えてください。
all:
propel: (任意のデータベース接続名。
「schema.yml」(後述)の
冒頭にある属性と対応する)
class: sfPropelDatabase
(データベースドライバクラスファイル
「sfPropelDatabase.class.php」。
Propelによりデータアクセスを行うので変更の必要はない)
param:
phptype: mysql (データベースシステム。他にsqlserver、
pgsql、sqlite、oracleが利用可能)
host: localhost (ホスト名)
database: codezine (データベース名)
username: root (接続ユーザー名)
password: root (接続パスワード)
これにより、プロジェクトがMySQLデータベース「codezine」を利用できるようになります。
データベース定義ファイルの生成(schema.yml)
symfonyではモデル作成のために「mysite/config/schema.yml」にテーブル構造を記録し管理しています。このファイルは自らの手で記述することもできますが、通常は既に存在しているテーブルから自動生成した方が簡単です。これはsymfony内でのO/RマッパーであるPropelによって実現されます。
あらかじめ、Propelのデータベース接続用の設定を行っておきます。Propel用設定ファイルである「mysite/config/propel.ini」内の「propel.database.ini」の項を次のように編集します。
propel.database.url = mysql://root:root@localhost/codezine
propel.database.urlパラメータで指定しているのは、データベース接続文字列です。接続文字列の形式は、MySQLの場合、「mysql://<データベース接続ユーザー名>:<接続パスワード>@<ホスト名>/<データベース名>」です。今回は便宜上、ユーザー名とパスワードをrootとしていますが、セキュリティなど十分に考慮し、適切なユーザー/パスワード設定を行ってください。
設定が済んだら、カレントフォルダはプロジェクトフォルダのままで、以下のコマンドを入力します。先程編集した「propel.ini」の設定に従って「codezine」データベースへの接続が行われ、データベース内のすべてのテーブルに関する情報を定義した「schema.yml」が生成されます。
symfony propel-build-schema
実際に生成されたschema.ymlファイルの中身は次のとおりです。最初の項目が「propel:」となっていますが、これは先程の「databases.yml」に記載されているデータベース接続の名前です(これは任意の値ですが、デフォルトでは名前が「propel」となっています)。
---
propel: (databases.ymlにあるデータベース接続名)
bbsdata: (テーブル名)
_attributes: (テーブルの属性が以下にインデントされ記述される)
idMethod: native (DBMS特有のID割り振りを用いる事を示す。
”none”であればそれを用いない)
id: (フィールド名。以下に属性がインデントされ記述される)
type: INTEGER (BOOLEAN/INTEGER/FLOAT/DATE/VARCHAR/TIMESTAMP
などの型)
required: true (trueなら必須項目)
autoIncrement: true (trueならオートインクリメント属性)
primaryKey: true (trueなら主キー)
title:
type: VARCHAR
size: 50 (文字列型において最大文字数の指定)
author:
type: VARCHAR
size: 30
mail:
type: LONGVARCHAR
url:
type: LONGVARCHAR
body:
type: LONGVARCHAR
passwd:
type: VARCHAR
size: 15
parent_id:
type: INTEGER
created_at:
type: TIMESTAMP
symfony 0.6.3の時の「schema.xml」に比べれば大分記述が簡潔になっています。symfonyがテーブルにアクセスするオブジェクト名は、「_attributes:」内にphpName属性の値を設定していればそれが、そうでなければテーブル名をやや変えたものが("_"を取り除いてその後の一文字目を大文字にする)使われます。今回の場合オブジェクト名は「Bbsdata」となります。フィールドについて必要な記述は基本的に型のみで、さらにフィールド名によっては何も指定せずとも特定の属性に解釈されます(下表参照)。ファイル中で主要な部分について、表でまとめておきます。
| 属性 | 内容 |
| 「_attributes:」内 | |
| idMethod: native | DBMS特有のID割り振りを用いる事を示す。"none"であればそれを用いない |
| phpName: Bbsdata | テーブルにアクセスするためのオブジェクト名 |
| 「フィールド名:」内 | |
| type: | (原則必須)BOOLEAN/INTEGER/FLOAT/DATE/VARCHAR/TIMESTAMPなどの型(*1) |
| required: | trueなら必須項目(デフォルトはfalse) |
| autoIncrement: | trueならオートインクリメント属性 |
| primaryKey: | trueなら主キーを示す(*2) |
| size: | (文字列型において)最大文字数の指定 |
| default: | デフォルト値の指定 |
| sequence: | PostgreSQLなどにおけるシーケンス名 |
| index: | trueならインデックス指定、uniqueなら重複のないインデックス指定 |
| foreignTable: | 外部キーに指定、その際の参照先テーブル名(*3) |
| foreignRefernce: | (foreignTable:指定がある時)外部テーブルの参照先フィールド名 |
| onDelete: | (外部キーにおいて)cascadeを指定すると、外部テーブルの関連レコードが消去された時に参照元(こちらの)テーブルのレコードが消去される |
| isCulture: | trueであれば国際化対応 |
- *1: フィールド名が「created_at」であれば特に指定しなくても「TIMESTAMP」型に設定される
- *2: フィールド名が「id」の場合は特に指定しなくても、主キーに設定される
- *3: フィールド名が「_id」で終わる場合は指定しなくても外部キーの指定がなされ、フィールド名の「_id」の前の部分で参照先テーブルが設定される(なお、今回のサンプルで「parent_id」というフィールド名を使用していますが、動作には支障ありません)。
symfony propel-build-sql
オブジェクトモデルの生成
次に、この「schema.yml」に従って、symfonyにおけるデータベース操作のためのオブジェクトモデルの自動生成を行いましょう。同じくプロジェクトフォルダ内で次のように入力します。
symfony propel-build-model
これで、テーブルに対応するクラスファイルとメソッドの一群が生成されました。以下に生成されたファイルを示します。
- mysite/lib/model/om/BaseBbsdata.php
- mysite/lib/model/om/BaseBbsdataPeer.php
- mysite/lib/model/Bbsdata.php
- mysite/lib/model/BbsdataPeer.php
- mysite/lib/model/map/BbsdataMapBuilder.php
「schema.yml」に記述されているテーブル名(あるいはphpName属性)から決められたオブジェクト名をもとに、一つのテーブルに対して上記の4つのファイルが生成されます。「<プロジェクトフォルダ>/lib/model/om/」内のクラスファイルは「symfony propel-build-model」を実行するたびに生成される(上書きされる)ベースデータアクセスクラスです。データモデルとそのアクセサメソッドなどが記述された「Base<オブジェクト名>.php」と、目的とするデータを抽出するためのメソッドが記述された「Base<オブジェクト名>Peer.php」があります。
これらのファイルを継承したものが「<プロジェクトフォルダ>/lib/model/」内の2つのデータアクセスクラスです。上記のファイル名から「Base」が取れたこちらのファイルに、今後カスタム関数などを追加していくことになります。こうすることで、いつデータベース上にテーブルやフィールドを追加して「symfony propel-build-model」を実行しても、クラスファイル内に作成したカスタム関数などが消されてしまうという心配をしなくても済むようになっています。
これらのクラスファイル群はデフォルトで、コンストラクタ、アクセサメソッド(->getメソッド/->setメソッド)を提供します
「<オブジェクト名>MapBuilder.php」は、ランタイム用にデータベースモデルを構築するためのクラスファイルです。
CRUD機能の自動生成:scaffolding機能
これで一通り、symfonyアプリケーションでデータベースを扱うための準備ができました。それでは、ここでscaffolding機能を使用してみましょう。これはデータベース操作のための基本的な機能をなす「足場」を提供するものです。以下のコマンドを入力してください。
symfony propel-generate-crud keijiban bbsdata Bbsdata
これで、データベース操作に必要な一通りの機能(Create、Retrieve、Update、Delete)を備えたbbsdataモジュールが自動生成されました。引数が3つありますが、「symfony propel-generate-crud <アプリケーション名> <作成するモジュール名> <モデルクラス名>」となっています。
以下のURLにアクセスしてみてください。
http://localhost/bbsdata
まだ何もレコードがない状態ですが、下にある[create]リンクから、テーブルにレコードを入力することができます。実際にいくつか入力してみてください。これだけのものが揃ったモジュールを自動生成してしまうあたり、symfonyの特色を垣間見ることができます。実際には、以下のアクションとテンプレートが自動生成されています。
| アクション名 | 役割 |
| index | listアクションへフォワードされる |
| list | レコード一覧の表示 |
| show | 単一レコードの詳細表示 |
| edit | レコードの編集 |
| update | レコードの更新 |
| delete | レコードの削除 |
| create | レコードの新規作成 |
| テンプレート名 | 役割 |
| editSuccess.php | レコード編集のためのフォーム群 |
| listSuccess.php | すべてのレコードの一覧表示 |
| showSuccess.php | 単一レコードの詳細表示 |
一通りの機能は実現されていますが、もちろんこれらをそのまま使う訳ではなく、あくまでアプリケーションを完成させるための「足場(scaffolding)」という位置づけになっています。

\Apache2.2\htdocs\mysite\web"
DirectoryIndex index.php
Alias /sf "C:\php\PEAR\data\symfony\web\sf"
