symfonyの威力を断片的に紹介。ご意見ご感想はこちらから。
symfonyでのプログラミング処理を紹介する上で当初は「急がば回れ」の方針の元、ログイン認証から
始めようと思ったんですが、いざ書き始めてみるとちょっとやっぱり最初からこの内容では
あまりにも敷居が高すぎることに気付き、考えを一転して逆に一番簡単で、
尚且つsymfonyの凄さに「おっ」と思わせるpropel-generate-crudを紹介することにします(笑)。
askeet!とは異なり、スキーマをschema.xmlではなく、現在のsymfonyの標準とされるschema.ymlを
使っての設定を紹介します。スキーマとは、データベースのテーブル構造を記述したファイルのことを言います。
Propelとschema.ymlとの関係についてはsymfony&Propelの威力を参照ください。
schema.yml はプロジェクト作成時に /symfuldaze/config に空ファイルとして既に生成されています。開いて編集しましょう。
symfony&Propelの威力を読んだ、もしくは同等の知識があることを前提に話を進めていきます。
プロジェクトの文字コードをUTF-8で進めている方はUTF-8で保存するように気をつけてください。
また、Unicodeサイン(BOM)は付けない、と言う設定で保存してください。
_attributesのところではPHPでのこのテーブルのオブジェクト名を記述しています。
特にする必要があったわけではありませんが、私は小文字のitemオブジェクトではなく、
大文字のItemオブジェクトにしたかったのでこのようにしました。どちらにせよ環境が変わって
テーブル名を変更せざるおえないような状況でもシステムの変更を最小限に抑えるためにも
データベースとモデルの名前は別々に記述している方が賢明ではないかと思います。
以下、私と同じ設定にしている、と言うのを前提に話を進めていきます。
続いてテストデータを作成します。
/symfuldaze/data
に
fixtures
と言うディレクトリを作ります。理由は後で述べますがまだ出来てもいない
ディレクトリなのに実はこれはsymfonyの規約です。
load_data.ymlと言うファイルを作成します。ちなみにこのファイル名は規約ではありません。
データの内容がくだらなくてすみません。自由に変えていただいて構いません。
余談ですが、UTF-8でUnicodeサイン(BOM)を付けた設定でも1行目に「---」とあれば不具合は起きません。
Unicodeサイン(BOM)を付けない設定であれば1行目の「---」は不要です。
ちなみにテストデータ挿入時では「id」、「updated_at」、「created_at」は
symfonyの規約として自動挿入してくれるので記述は不要です。
それではデータベースにテーブルを作成し、テストデータを挿入する、と言う処理を1つのコマンドで行いましょう。
¥ symfony propel-build-all-load index
最後の引数はアプリケーション名を意味します。
このコマンドは最近出来たものだと予測されます(2007年8月現在)。
askeet!が執筆された時点ではまだ紹介されていません。
このコマンドは1つのコマンドで一気に
propel-build-model ~ スキーマファイルに基づきモデルを作成
propel-build-sql ~ スキーマファイルに基づきCreate TABLE SQL文を作成
propel-insert-sql ~ Create TABLE SQL文を実行
propel-load-data ~ テストデータを挿入
と言うコマンドを全て実行してくれます。
propel-build-all-loadコマンドは上手く処理されましたでしょうか?
上手くいかなかった場合は上記のpropel-build-modelから始まる4つのコマンドを1つずつ実行し、
エラーになるところをつきつめてみましょう。YAMLファイルの文字コードはちゃんとUTF-8になっていますか?
propel-load-dataと言うコマンドも最近(2007年8月現在)出来たものだと予測されます。
askeet!ではテストデータの挿入はPHPスクリプトで処理されているのと、
先程「理由は後で述べる」と述べたのがこのことなんですが、現時点(バージョン1.0.5)での
symfonyではpropel-load-dataコマンドは/data/fixtures/内全てのYAMLファイルのデータを
データベースに挿入しますが、規約がそうなのにも関わらず、そのディレクトリ自体は
init-projectの際は作成されず、手動で作成する必要があります。
それではお待たせしました、propel-generate-crudコマンドを実行してみます。
¥ symfony propel-generate-crud index item Item
最初の引数はアプリケーション名、次がモジュール名、最後がモデル名を意味します。
それでは見てみましょう!
http://localhost/symfuldaze/web/item (最後にスラッシュは入れないでください)
http://localhost/symfuldaze/web/item/create
http://localhost/symfuldaze/web/item/show/id/1
http://localhost/symfuldaze/web/item/edit/id/1
http://localhost/symfuldaze/web/item/list
ちゃんと表示されましたでしょうか???
静的サンプルは下記のようになります。
/symfuldaze/web/item
/symfuldaze/web/item/create
/symfuldaze/web/item/show/id/1
/symfuldaze/web/item/edit/id/1
/symfuldaze/web/item/list
ちなみにitemだけで呼び出されるページ、itemモジュールのindexアクションは
デフォルトのpropel-generate-crud処理でそのままlistアクションが呼び出されるようになっています。
なので、表示内容が一緒です。
「なんだ、scaffoldじゃん」と仰られる方はRuby on Railsの方面から来られましたか?まぁ、はい、そゆことです(笑)。