symfonyの威力を断片的に紹介。ご意見ご感想はこちらから。
下記サイトで紹介されている内容と似たような内容なので併用してお役に立てれば幸いです。
symfonyで開発日記 schema_ymlがどこまで楽させてくれるか
symfonyではデータベースの構造を/symfuldaze/config/schema.yml
と言うファイルに記述し、プロジェクトとデータベースの連携を強化させます。
(ちなみに「symfuldaze」の部分は言うまでもなくプロジェクト名です)
これはsymfonyがO/RマッパーとしてPropelを採用しているからで、
Propelはこのスキーマファイルの情報を元にプロジェクトとデータベースの関係を保持します。
スキーマファイルはYAML形式とXML形式両方をサポートしていて、
以前はXML形式が標準でしたが、最近になってYAML形式標準に変更されたようです。
YAMLはXMLと同じように構造化されたデータを表現するためのフォーマットの1つで、
実績としては主にRuby言語のコミュニティで高い評価を得ていてRuby on Railsでは
YAMLが採用されています。特徴としてはタグではなく、インデントでデータ構造を表現し、
XMLより読み書きがしやすいと言われています。
只、askeet!チュートリアルはXMLで説明されているので当初は面倒だなぁ、と思っていましたが、
下記使用例を見ていただくとYAML形式に変わったことも納得していただけるのではないかと思います。
とだけ記述します。プロジェクトの文字コードをUTF-8で進めている方はUTF-8で保存するように気をつけてください。
また、Unicodeサイン(BOM)は付けない、と言う設定で保存してください。
データベース名がどうであれ、1行目に(データベース名として)propel:と記述するのがsymfonyの決まりごとです。
symfonyはpropel.iniより本来のデータベース名を取得します。
続いて、コンソール画面にて(最初にプロジェクト直下に移動するのは大前提です)
とコマンドを打つと
/symfuldaze/config/schema.yml
がXML形式に変換され
/symfuldaze/config/schema.xml
として保存されます。
通常この変換作業は不要ですが、
今回はsymfony&Propelの威力を検証するために変換します。
中身を見てみましょう。
たった1行のyamlデータがこれだけのxmlデータに変換されるのが確認できます。
と記述します。データベースにuserテーブルの存在を定義します。
userテーブルにidと言うカラムが、整数型、必須、PK、AutoIncrementと言うプロパティで自動的に付加されています。
これはRuby on Railsで提案されたConvention Over Configuration、「設定より規約」と言う理念に基づいています。
逆の言い方をすればどうしてもidと言うカラムを持ったテーブルを持ちたくない方は
Ruby on Railsもsymfonyも使うな、と言うことでしょうか。
広島弁で言うと「悪いことにはならんけぇ、この規約を守りんちゃい」です。
話それますが先日テレビで放映されたドラマ「はだしのゲン」はなかなか良かったです。子供たちの演技が素晴らしかった。
とユーザー名を追加します。
idの記述はschema.ymlには不要だと先程述べたばかりですが、記述したのには理由があります。
したは言え「id:」としか記述していないことにも注目ですが。
と、idを記述しない場合
のようにidが最後に付加されます。
最初に来てほしいです。
なので最初に「id:」とだけ記述すれば1番目のカラムに必要なプロパティを加えてテーブルを生成してくれます。
idと同様、updated_atもcreated_atも規約で型の宣言を不要としています。スペルには気をつけてください。
updated_atとcreated_atは自動的にTIMESTAMP型が付加されます。
またsave()メソッドでデータを追加、更新する際はupdated_atとcreated_atは
定義しなくてもバックエンドで自動的に値を追加、更新してくれます。
linkと言う名前のテーブルを追加し、その中にuser_idと言うカラムを追加します。
linkテーブルのuser_idに自動でuserテーブルへの外部キーが貼られていることに注目してください。
言うまでもなくこれも規約で、symfonyのsfPropelDatabaseSchemaクラスが
テーブル内に「_id」と言うカラムを見つけたらその前方の文字列と同じ名前のテーブルを探し、
存在したカラムにはそのテーブルとの外部キーを自動的に足してくれるみたいです。
ここで注意点が1つあります。
linkテーブルのuser_idもuserテーブルのidと同様に型を記述してはならない、と言うことです。
例えばlinkテーブルのuser_idにinteger型を記述してしまうとsymfonyはこれらのカラムは無関係と見なすようです。
ちなみに両方にinteger型を付加して試しましたがそれもダメでした。
linkテーブルのuser_idは型も何も記述をせず、無条件で身を任せないと外部キーを自動付加してくれないようです。
以上、触り程度のsymfonyで利用される際のPropelの紹介ですが、いかがだったでしょうか?
更にコンソールでpropel-generate-crud(Ruby on Railsで言う、schaffold)をしたり、
$link->getUser()->getUsername()などを実行したりしていけばsymfony&Propelの威力は更に実感できると思います。
Ruby on Railsを熟知している人達からすれば「え、これ、Railsでもできるよ」みたいな内容かもしれません。
まぁ、今はPHPの話をしているので多言語のツッコミはご遠慮くださいませ(笑)。