symfonyは、自前でO/R Mapperのフレームワークを持っています。
symfonyで、RAD開発するのならば、symfonyが要求するルールどおりに、ERを構築しなければなりません。
DBA(DataBase Administrator)が居るプロジェクトの場合、スキーマからPHPコードを作ります。
では、DBAが居ないプロジェクトの場合は、どうしましょう。
自分は、これもスキーマからPHPコードを作ったほうが良いと考えます。
ymlのコードからDBスキーマを作るSQLコードも作ることもできますが、どうしてもER図などを作る必要があり、
ymlコードからER図を作るツールが存在しない(?)という状況から、DBスキーマからPHPコードを作ったほうが良いと考えます。
PHPからのDB接続環境を整えるため、php.iniを編集します。
ここでは、MySQLに接続するための設定を説明します。
以下のコメントアウトをはずします。
extension=php_mysql.dll extension=php_pdo_mysql.dll extension=php_mysqli.dll
php_mysqli.dllの読み込みは不要。かもしれません。
いかのようにコマンドを投入します。ホスト名、接続DB名、ユーザー名、パスワードは適宜修正します。
symfony configure:database "mysql:host=localhost;dbname=techch" root mYsEcret
すると、config/databases.yml がこのように作成されます。(手で修正しても可)
dev:
propel:
param:
classname: DebugPDO
test:
propel:
param:
classname: DebugPDO
all:
propel:
class: sfPropelDatabase
param:
classname: PropelPDO
dsn: 'mysql:host=localhost;dbname=techch'
username: root
password: mYsEcret
encoding: utf8
persistent: true
pooling: true
[dev:] の欄は、開発用スキーマを指定します。
[test:] の欄は、結合(総合)テスト用のスキーマーを指定します。
[all:]の欄は、本番用のスキーバーを指定します。
この辺の詳しい説明と意味については、本家のマニュアルの「環境」という欄にそれとなく書かれて
いますで、それを参考にしてください。
1日目: プロジェクトを始める
http://www.symfony-project.org/jobeet/1_2/Propel/ja/01
このコマンドを打つと、スキーマーから[schema.yml]を、自動で作ることができます。
symfony propel-build-schema
自動的に作成された[schema.yml]は、以下のようなファイルです。
propel:
_attributes:
package: lib.model
defaultIdMethod: native
affiliate:
_attributes: { phpName: Affiliate }
id: { type: INTEGER, size: '11', primaryKey: true, required: true }
url: { type: VARCHAR, size: '255', required: true }
email: { type: VARCHAR, size: '255', required: true }
token: { type: VARCHAR, size: '255', required: true }
is_active: { type: TINYINT, size: '1', required: true, defaultValue: '0' }
create_at: { type: TIMESTAMP, required: true, defaultValue: CURRENT_TIMESTAMP }
_uniques: { uk_email: [email] }
category:
_attributes: { phpName: Category }
id: { type: INTEGER, size: '11', primaryKey: true, required: true }
name: { type: VARCHAR, size: '255', required: true }
_uniques: { uk_name: [name] }
category_affiliate:
_attributes: { phpName: CategoryAffiliate }
category_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: category, foreignReference: id, onDelete: RESTRICT, onUpdate: RESTRICT }
affiliate_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: affiliate, foreignReference: id, onDelete: RESTRICT, onUpdate: RESTRICT }
_indexes: { fk_category_affiliate_affiliate: [affiliate_id], fk_category_affiliate_category: [category_id] }
job:
_attributes: { phpName: Job }
id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
category_id: { type: INTEGER, size: '11', required: false, foreignTable: category, foreignReference: id, onDelete: RESTRICT, onUpdate: RESTRICT }
type: { type: VARCHAR, size: '255', required: false }
company: { type: VARCHAR, size: '255', required: true }
logo: { type: VARCHAR, size: '255', required: false }
url: { type: VARCHAR, size: '255', required: false }
position: { type: VARCHAR, size: '255', required: true }
location: { type: VARCHAR, size: '255', required: true }
description: { type: LONGVARCHAR, required: true }
how_to_apply: { type: LONGVARCHAR, required: true }
token: { type: VARCHAR, size: '255', required: true }
is_public: { type: TINYINT, size: '1', required: true, defaultValue: '1' }
is_activated: { type: TINYINT, size: '1', required: true, defaultValue: '0' }
email: { type: VARCHAR, size: '255', required: true }
expires_at: { type: TIMESTAMP, required: true, defaultValue: CURRENT_TIMESTAMP }
create_at: { type: TIMESTAMP, required: true, defaultValue: '0000-00-00 00:00:00' }
updated_at: { type: TIMESTAMP, required: true, defaultValue: '0000-00-00 00:00:00' }
_indexes: { fk_job_category: [category_id] }
_uniques: { uk_token: [token] }
説明なしに[schema.yml]を見せてしまいましたが、symfonyの公式チュートリアル、
3日目: データモデル http://www.symfony-project.org/jobeet/1_2/Propel/ja/03
に書かれていたデータモデルです。
これをMYSQL用のスキーマ、[techch]に展開しました。
このスキーマを作るSQLは、以下のです。
このSQLを作るために、[MySQLWorkbench]を使用しました。
ER図を作りながら、SQL文を作ることができるので便利です。
データファイルは、以下です。
出来上がった、schema.ymlを元にして、phpのコードに変換します。
symfony propel:build-model
こんなエラーが発生してしまいました。設定漏れのようです。
D:\Apache\Apache2.2\htdocs\host2.localhost>symfony propel:build-model >> schema converting "D:/Apache/Apache2.2...lhost/config/schema.yml" to XML >> schema putting D:/Apache/Apache2.2/htd...ost/config/generated-schema.xml >> propel Running "om" phing task [propel-om] Could not perform XLST transformation. Make sure PHP has been compiled/configured to support XSLT. D:\Apache\Apache2.2\htdocs\host2.localhost>
検索エンジンで引っかかるように、エラーの状態も残しておきます。
XSLTのサポートができるようにしないとだめです。
php.iniをエディットし、
extension=php_xsl.dll
を有効にします。
とりあえず、Apacheを再起動します。
もう一回、チャレンジです。
コアダンプしました。でも、若干ですが動作が変わりました。
作成されたschema.ymlを若干修正します。
修正箇所は以下の通りです。
defaultValue: CURRENT_TIMESTAMP ↓ defaultValue: '0000-00-00 00:00:00'
そうすると、このようになりました。
D:\Apache\Apache2.2\htdocs\host2.localhost>symfony propel:build-model >> schema converting "D:/Apache/Apache2.2...lhost/config/schema.yml" to XML >> schema putting D:/Apache/Apache2.2/htd...ost/config/generated-schema.xml >> propel Running "om" phing task >> file- D:/Apache/Apache2.2/htdocs/host...ost/config/generated-schema.xml PHP Warning: unlink (D:/Apache/Apache2.2/htdocs/host2.localhost/config/generated-schema.xml): Permission denied in D:\php\PEAR\sym fony\task\sfFilesystem.class.php on line 143 >> file- D:/Apache/Apache2.2/htdocs/host...enerated-schema-transformed.xml PHP Warning: unlink (D:/Apache/Apache2.2/htdocs/host2.localhost/config/generated-schema-transformed.xml): Permission denied in D:\ php\PEAR\symfony\task\sfFilesystem.class.php on line 143 >> autoload reloading autoloading
書き込みができなかったようです。
フォルダに書き込み許可を与えると、以下のようにうまく動作しました。
D:\Apache\Apache2.2\htdocs\host2.localhost>symfony propel:build-model >> schema converting "D:/Apache/Apache2.2...lhost/config/schema.yml" to XML >> schema putting D:/Apache/Apache2.2/htd...ost/config/generated-schema.xml >> propel Running "om" phing task >> file- D:/Apache/Apache2.2/htdocs/host...ost/config/generated-schema.xml >> file- D:/Apache/Apache2.2/htdocs/host...enerated-schema-transformed.xml >> autoload reloading autoloading D:\Apache\Apache2.2\htdocs\host2.localhost>
まだまだ、続く。