2日目は設計だけなのでスルーということで。
前回プロジェクトとアプリケーションを作りました。
今回はモジュールを作成します。
がその前に、とりあえずデータベースと接続アカウントを作成します。
CREATE DATABASE `jobeet` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `jobeet_dev` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'jobeet'@'localhost' IDENTIFIED BY 'jobeetpass';
GRANT ALL PRIVILEGES ON `jobeet` . * TO 'jobeet'@'localhost';
GRANT ALL PRIVILEGES ON `jobeet_dev` . * TO 'jobeet'@'localhost';
次に、O/RマッパをデフォルトのPropelからDoctrineに変更します。
何故Doctrineを選んだかって言われても特に深い意味はありません。
config/ProjectConfiguration.class.phpの
$this->enableAllPluginsExcept(array('sfDoctrinePlugin', 'sfCompat10Plugin'));
となっている行を
$this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
に変更します。
見ての通り、sfPropelPluginとsfCompat10Plugin「以外を」使用する、という設定になります。
で、sfCompat10Pluginって何?
Doctrineを使用可能にするために以下のコマンドを実行します。
>php symfony cc
>php symfony plugin:publish-assets
Propelで使用していた以下のディレクトリ、ファイルを削除します。
web/sfDoctrinePlugin/
config/propel.ini
config/schema.yml
config/databases.yml
データベース情報を設定します。
>php symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=localhost;dbname=jobeet" jobeet jobeetpass
config/databases.ymlが作成されるので、中身を編集します。
all: doctrine: class: sfDoctrineDatabase param: dsn: 'mysql:host=localhost;dbname=jobeet' username: jobeet password: jobeetpass dev: doctrine: class: sfDoctrineDatabase param: dsn: 'mysql:host=localhost;dbname=jobeet_dev' username: jobeet password: jobeetpass |
このようにすることで、index.phpからアクセスした場合はallの方のDBが、frontend_dev.phpからアクセスしてきた際はjobeet_devのDBが自動的に使われるようになります。
今後拡張子がymlのファイルがよく出てきますが、これはYAMLというデータ形式です。
スペースが意味を持つ形式なので、勝手にタブにしたりスペースを広げたりといったことはできません。
XMLのように面倒なタグなどを考える必要が全くないので、データを突っ込むのに非常に便利な形式となっています。
ということで次にYAMLでスキーマファイルを作成します。
http://www.symfony-project.org/jobeet/1_2/Doctrine/ja/03からconfig/doctrine/schema.ymlをそのままコピペ。
スキーマファイルとは要するにデータベースの設計図です。
これを書いておくと、DBからデータを読み込んだり逆に書き込んだりする際の助けになります。
それどころかDoctrineではスキーマファイルからCREATE TABLE文を作成してテーブルを自動作成したりといったことまで行うことができます。
というわけで一件便利なスキーマファイルですが、データベースの設計変更があった場合の修正が非常に面倒という問題があります。
自動作成コマンドだとテーブルの中身が綺麗さっぱり削除されたりするので運用開始後に設計変更とかが入ってきた場合どうにもならないんですよね。
この点、データベースからスキーマを取得してくるCakePHPとは真逆の思想です。
スキーマファイルの準備ができたら以下のコマンドを実行します。
>php symfony doctrine:build-model
>php symfony doctrine:build-sql
>php symfony doctrine:insert-sql
順にモデルを作成するコマンド、テーブルを作成するSQLを作成するコマンド、SQLを実行してテーブルを実際に作成するコマンドになります。
build-modelを実行すると、lib/model/doctrineディレクトリ内にテーブル毎にモデルファイルが作成されます。
これを編集することで、データの挿入や検索等をカスタマイズすることができるようになります。
最後に
>php symfony cc
としてキャッシュを削除し、作成したモデルを読み込むようにします。
これでスキーマとモデルが完成しました。
次にテストデータを登録します。
直接SQLを作成する必要はなく、スキーマ同様YMLファイルに記述しておき、それをコマンドで突っ込むことになります。
チュートリアルではこれがよい方法とか言っていますが、既存データを残しておきたい場合はどうするんだよといった疑問には答えてくれません。
data/fixtures/categories.ymlおよびdata/fixtures/jobs.ymlをそのままコピペ。
他に追加したいデータがあれば同じ形式で追加します。
といってもモデルオブジェクトとか意味がわかりませんが。
fixturesを保存した後、
>php symfony doctrine:data-load
を実行すると各YMLからデータを読み込んでデータベースに入れてくれます。
同時に該当のテーブルにそれまで蓄積されていたデータは全て消えます。
これだけやってようやくモデルの作成という下準備が終了しました。
モジュールを作成してみます。
>php symfony doctrine:generate-module --with-show --non-verbose-templates frontend job JobeetJob
jobeet_jobテーブルを閲覧、登録、更新、削除するモジュールができました。
ブラウザから
http://symfony.localhost/frontend_dev.php/job
とかそんなかんじでアクセスすると閲覧することができます。
どうなってるの?
さあ?
Symfonyの記事一覧