Doctrine

Posted by muchag | Symfony 1.x |
初回投稿:2011-06-02 (木) 20:26:31 | 最終更新:2015-06-03 (水) 21:45:37

Practical symfony 3日目: データモデル
を、実際に試しながら自分用に残すメモ。

ロボットのように設定しただけで
さっぱりピンときてない・・・。

【環境】
symfony:1.4.13
doctrine:1.2.4

Doctrine Manual
英語版
日本語版

デフォルト ORM

参考元サイトを見ると Symfony のデフォルトは Propel とのことだが
アーカイブからインストール したせいかヴァージョンの問題か
私の環境ではデフォルトが Doctrine であった。

よって、Propel から Doctrine へ移行する手順は参考元サイトを参照。
 

databases.yml

DB 接続情報を記載。

コマンドラインの jobeet プロジェクトルートまで移動して

  1. >I:\xampp\php\php symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=localhost;dbname=jobeet" root mYsEcret

とすることで、以下のファイルが自動生成される。

jobeet\config\databases.yml
  1. all:
  2.   doctrine:
  3.     class: sfDoctrineDatabase
  4.     param:
  5.       dsn: 'mysql:host=localhost;dbname=jobeet'
  6.       username: root
  7.       password: mYsEcret

ちなみに、私の環境では、パスワードこそ空白のものの
それ以外の部分を記載した databases.yml がデフォルトで設置されていた。
 

パラメータ

参考元サイト:アシアルブログ symfony DoctrineのTIPS
こちらを見ると、パラメータが他にも設定してある。

これを参考にすると、こんな感じ。

  1. all:
  2.   doctrine:
  3.     class: sfDoctrineDatabase
  4.     param:
  5.       classname:  DoctPDO
  6.       dsn: 'mysql:host=localhost;dbname=jobeet'
  7.       username: root
  8.       password: mYsEcret
  9.       encoding:   utf8
  10.       persistent: true
  11.       pooling:    true

コマンドラインからの自動生成では不十分そうだ。
 

schema.yml
DB があるとき

コマンドラインの jobeet プロジェクトルートまで移動して

  1. >I:\xampp\php\php symfony doctrine:build-schema

で、作成できるらしいが試していない。
 

バグ

ヴァージョンがわからないが
これを実行すると databases.yml の connection の行が消えるバグがあるらしい。
参考元サイト:アシアルブログ symfony DoctrineのTIPS
 

DB がないとき

気合で記述する。

jobeet\config\doctrine\schema.yml
  1. # config/doctrine/schema.yml
  2. JobeetCategory:
  3.   actAs: { Timestampable: ~ }
  4.   columns:
  5.     name: { type: string(255), notnull: true, unique: true }
  6.  
  7. JobeetJob:
  8.   actAs: { Timestampable: ~ }
  9.   columns:
  10.     category_id:  { type: integer, notnull: true }
  11.     type:         { type: string(255) }
  12.     company:      { type: string(255), notnull: true }
  13.     logo:         { type: string(255) }
  14.     url:          { type: string(255) }
  15.     position:     { type: string(255), notnull: true }
  16.     location:     { type: string(255), notnull: true }
  17.     description:  { type: string(4000), notnull: true }
  18.     how_to_apply: { type: string(4000), notnull: true }
  19.     token:        { type: string(255), notnull: true, unique: true }
  20.     is_public:    { type: boolean, notnull: true, default: 1 }
  21.     is_activated: { type: boolean, notnull: true, default: 0 }
  22.     email:        { type: string(255), notnull: true }
  23.     expires_at:   { type: timestamp, notnull: true }
  24.   relations:
  25.     JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }
  26.  
  27. JobeetAffiliate:
  28.   actAs: { Timestampable: ~ }
  29.   columns:
  30.     url:       { type: string(255), notnull: true }
  31.     email:     { type: string(255), notnull: true, unique: true }
  32.     token:     { type: string(255), notnull: true }
  33.     is_active: { type: boolean, notnull: true, default: 0 }
  34.   relations:
  35.     JobeetCategories:
  36.       class: JobeetCategory
  37.       refClass: JobeetCategoryAffiliate
  38.       local: affiliate_id
  39.       foreign: category_id
  40.       foreignAlias: JobeetAffiliates
  41.  
  42. JobeetCategoryAffiliate:
  43.   columns:
  44.     category_id:  { type: integer, primary: true }
  45.     affiliate_id: { type: integer, primary: true }
  46.   relations:
  47.     JobeetCategory:  { onDelete: CASCADE, local: category_id, foreign: id }
  48.     JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }

以上、公式からのコピペ。
 

ORM
モデルの生成

コマンドラインの jobeet プロジェクトルートまで移動して

  1. >I:\xampp\php\php symfony doctrine:build --model

とすることで

jobeet\lib\model\doctrine

が生成され

doctrine
◇┣ base
◇┃◇┣ BaseJobeetAffiliate.class.php
◇┃◇┣ BaseJobeetCategory.class.php
◇┃◇┣ BaseJobeetCategoryAffiliate.class.php
◇┃◇┗ BaseJobeetJob.class.php
◇┃    ↑ Base*** は *** の親クラス。doctrine:build –model を実行するたびに上書きされる
◇┃    ↑ よって、全てのカスタマイズは *** クラスで行うこと
◇┣ JobeetAffiliate.class.php
◇┣ JobeetAffiliateTable.class.php
◇┣ JobeetCategory.class.php
◇┣ JobeetCategoryAffiliate.class.php
◇┣ JobeetCategoryAffiliateTable.class.php
◇┣ JobeetCategoryTable.class.php
◇┣ JobeetJob.class.php
◇┗ JobeetJobTable.class.php
    ↑ ***Table クラスは *** オブジェクトのコレクションを返すメソッドなどを定義する
    ↑ *** クラスのオブジェクトは、当該テーブルの単独のレコードを表す

これだけのファイルが自動生成された。
 

概略

jobeet_job テーブルに対して、以下の3つのクラスファイルが生成される。

  • JobeetJob.class.php
    JobeetJob クラスのオブジェクトは、当該テーブルの単独のレコードを表す
  • BaseJobeetJob.class.php
    BaseJobeetJob は JobeetJob の親クラス。doctrine:build –model を実行するたびに上書きされる
    よって、全てのカスタマイズは JobeetJob クラスで行うこと
  • JobeetJobTable.class.php
    JobeetJobTable クラスは JobeetJob オブジェクトのコレクションを返すメソッドなどを定義する

 

SQL の生成
  1. >I:\xampp\php\php symfony doctrine:build --sql

更にコマンドを上述のようにして続けると

jobeet\data\sql\schema.sql

を自動生成してくれる。
 

テーブル群の生成
  1. >I:\xampp\php\php symfony doctrine:insert-sql

とすることで、実際にテーブルを生成してくれる。

 

一括処理
  1. >I:\xampp\php\php symfony doctrine:build --all --no-confirmation

とすることで、今までの一連の作業を一括処理してくれる。
 

キャッシュの削除

参考元サイトによると、ここでキャッシュの削除を行う。

  1. >I:\xampp\php\php symfony cc

 

初期データのセッティング

symfony では、DB のテーブルを作成するたびに全てのデータが消える。

よって、ユーザに因らないデータ=初期データを毎回取り込まねばならない。

それには doctrine:data-load タスクを用いる。
 

フィクスチャファイル
jobeet\data\fixtures\categories.yml
  1. # data/fixtures/categories.yml
  2. JobeetCategory:
  3.   design:
  4.     name: Design
  5.   programming:
  6.     name: Programming
  7.   manager:
  8.     name: Manager
  9.   administrator:
  10.     name: Administrator

 

jobeet\data\fixtures\jobs.yml
  1. # data/fixtures/jobs.yml
  2. JobeetJob:
  3.   job_sensio_labs:
  4.     JobeetCategory: programming
  5.     type:         full-time
  6.     company:      Sensio Labs
  7.     logo:         sensio-labs.gif
  8.     url:          http://www.sensiolabs.com/
  9.     position:     Web Developer
  10.     location:     Paris, France
  11.     description:  |
  12.       You've already developed websites with symfony and you want to work
  13.       with Open-Source technologies. You have a minimum of 3 years
  14.       experience in web development with PHP or Java and you wish to
  15.       participate to development of Web 2.0 sites using the best
  16.       frameworks available.
  17.     how_to_apply: |
  18.       Send your resume to fabien.potencier [at] sensio.com
  19.     is_public:    true
  20.     is_activated: true
  21.     token:        job_sensio_labs
  22.     email:        job@example.com
  23.     expires_at:   '2010-10-10'
  24.  
  25.   job_extreme_sensio:
  26.     JobeetCategory:  design
  27.     type:         part-time
  28.     company:      Extreme Sensio
  29.     logo:         extreme-sensio.gif
  30.     url:          http://www.extreme-sensio.com/
  31.     position:     Web Designer
  32.     location:     Paris, France
  33.     description:  |
  34.       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
  35.       eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
  36.       enim ad minim veniam, quis nostrud exercitation ullamco laboris
  37.       nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  38.       in reprehenderit in.
  39.  
  40.       Voluptate velit esse cillum dolore eu fugiat nulla pariatur.
  41.       Excepteur sint occaecat cupidatat non proident, sunt in culpa
  42.       qui officia deserunt mollit anim id est laborum.
  43.     how_to_apply: |
  44.       Send your resume to fabien.potencier [at] sensio.com
  45.     is_public:    true
  46.     is_activated: true
  47.     token:        job_extreme_sensio
  48.     email:        job@example.com
  49.     expires_at:   '2010-10-10'

の2つのファイルを用意する。(公式よりコピペ)

※この job フィクスチャファイルは2つの画像を参照するので
http://www.symfony-project.org/get/jobeet/sensio-labs.gif
http://www.symfony-project.org/get/jobeet/extreme-sensio.gif
を DL して

jobeet\web\uploads\jobs

に配置する。

※ YAML ファイルでは
description カラムのようにデータが複数行になる=文字列が改行を含むときは
| (パイプ)を用いる。
 

doctrine:data-load

コマンドラインの jobeet プロジェクトルートまで移動して

  1. >I:\xampp\php\php symfony doctrine:data-load

とすることで
jobeet_category, jobeet_job の2テーブルにデータが挿入される。
 

doctrine:build –all –and-load

このタスクによってフォーム、フィルタ、モデルを生成し、
データベースを削除してからすべてのテーブルを再作成する。

  1. >I:\xampp\php\php symfony doctrine:build --all --and-load

これはつまり、ここまでの全てを一括処理してくれるということかしら?
 

モジュール

JobeetJob モデル用の、基本的な操作機能を提供するモジュールを自動生成。

  1. >I:\xampp\php\php symfony doctrine:generate-module --with-show --non-verbose-templates frontend job JobeetJob

とすることで

jobeet\apps\frontend\modules\job

job
◇┣ actions
◇┃◇┗ actions.class.php
◇┗ templates
◇◇◇┣ _form.php
◇◇◇┣ editSuccess.php
◇◇◇┣ indexSuccess.php
◇◇◇┣ newSuccess.php
◇◇◇┗ showSuccess.php

これらのファイルが自動生成される。
 

フォームの生成

もしここでエラーが出るようなら、上記コマンドの前に

  1. >I:\xampp\php\php symfony doctrine:build-forms

とし、フォームの生成を行う。
参考元サイト:ネットの隅でまったりと Symfony で最初の24時間にやること:3時間目
 

モジュールのテスト

http://localhost/frontend_dev.php/job

と、楽しみ~に上記アドレスへアクセスしたら、上図の結果で目を丸くした@@

でもまぁ 冷静に考えれば、このアドレスで編集画面のわけがなく
適当に類推して
 

詳細画面

http://localhost/frontend_dev.php/job/show/id/1
 

編集画面

http://localhost/frontend_dev.php/job/edit/id/1

と、無事に見ることができた。
 

Tips

1.複数のデータベースに接続
2.sqlの数を減らす
3.関連データをまとめて削除
参考元サイト:アシアルブログ symfony DoctrineのTIPS

バージョンチェック
  1. echo Doctrine::VERSION;
  2.  
  3. $version = Doctrine::VERSION;

など。

参考サイト

公式:Practical symfony 3日目: データモデル
ここを読んでも上手くいかなかったので
symfony で開発 Blog:Jobeet3日目 Doctrineでデータモデル作成
こちらを参考にさせていただきました。

symfony-doc-ja:sfDoctrinePlugin

Posted by muchag | Symfony 1.x |
初回投稿:2011-06-02 (木) 20:26:31 | 最終更新:2015-06-03 (水) 21:45:37

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment