Doctrine2とZendFrameworkの統合

時間は止まらず、時間を追って走らなければなりません。

ZF2は準備中です。 最初のマイルストーンがリリースされました。 Zend Framework 2.0.0dev1リリース Doctrine2 BETA3-金曜日でした。

優れたプログラマーが止まることは決してありません。時間はありません。 先に進んでください-テーブルを作ります-「食品のコード」。



夕方には何もすることがありませんでした...



ライブラリのソースコードをダウンロードすると、再生が開始されました。 目標は、ZF構造を維持しながらモデルを作成し、Doctrine2接続を介して作業できるようにすることです。

最初に、Doctrine2の一部であるクラスをinclude_pathに配置する必要があります。



library/Doctrine

libray/Symfony









symfonyはDoctrine2が動作するためにすぐに使用できるツールを使用する必要があります(コンソールとYamlの2つのコンポーネント)。

configs / application.iniにオートローダーのデータを書き込みます。

autoloadernamespaces.doctrine = "Doctrine"

autoloadernamespaces.symfony = "Symfony"









カットの下で続けた。 application.iniに記述するオプション。 ソースコードリソースプラグインであるDoctrine2の接続方法。





私のアプリケーションでは、

appnamespace = "Ecom"







現時点では、リソースプラグインへのパスを登録する「美しい」方法は見つかりませんでした。

pluginpaths.Ecom\Application\Resources = APPLICATION_PATH "/resources"









Doctrine2の設定パラメータ。私にとっては、データベースへの接続の設定にすぎません(今のところ、これ以上は必要ありません)。

resources.doctrine2.connection.driver = "pdo_mysql"

resources.doctrine2.connection.host = "localhost"

resources.doctrine2.connection.user = "root"

resources.doctrine2.connection.password = ""

resources.doctrine2.connection.dbname = "doctrinedb"









リソースプラグインには名前空間が必要です-Ecom \ Application \ Resources; また、クラス名はapplication.iniの名前と一致する必要があります。



<?php



名前空間 Ecom \ Application \ Resources



Doctrine \ Common \ Utilを使用してください



Ecom \ Documentを使用します。



Doctrine \ ORMを使用します。

Doctrine \ DBALを使用してください

Doctrine \ Commonを使用します。

Doctrine \ Common \ Cacheを使用してください

Zend \ Application \ Resourceを使用します。



クラス Doctrine2 Resource \ AbstractResource {を 拡張します



パブリック 関数 init {



$ front = $ this- > getBootstrap -> getResource 'frontcontroller' ;

$ modules = $ front- > getControllerDirectory ;

$ entityModels = array ;

foreach $ module as $ module => $ moduleDirectory {

$ dir = dirname $ moduleDirectory 「/モデル」 ;

if is_dir $ dir {

$ entityModels [ ] = $ dir ;

}

}



$ options = $ this- > getOptions ;



$ config = new ORM \ Configuration ;



$ config- > setProxyDir APPLICATION_PATH '/ proxies ' ;

$ config- > setProxyNamespace 'Ecom \ Proxy' ;

$ config- > setAutoGenerateProxyClasses $ this- > getBootstrap -> getEnvironment == "development" ;



$ driverImpl = $ config- > newDefaultAnnotationDriver $ entityModels ;

$ config- > setMetadataDriverImpl $ driverImpl ;



if $ this- > getBootstrap -> getEnvironment == "development" {

$ cache = new Cache \ ArrayCache ;

} else {

$ cache = 新しい Cache \ ApcCache ;

}



$ config- > setMetadataCacheImpl $ cache ;

$ config- > setQueryCacheImpl $ cache ;



$ evm = new Common \ EventManager ;

$ entityManager = ORM \ EntityManager :: create $ options [ 'connection' ] $ config $ evm ;



$ eventDocument = new EventDocument $ entityManager- > getEventManager ;



return $ entityManager ;

}

}





クラス EventDocument {



プライベート $ evm ;



public $ preFooInvoked = false ;

public $ postFooInvoked = false ;



パブリック 関数 __construct $ evm

{

$ this- > evm = $ evm ;

// $ evm-> addEventListener(array(ORM \ Events :: preRemove)、$ this);

// $ evm-> addEventListener(array(ORM \ Events :: postRemove)、$ this);

// $ evm-> addEventListener(array(ORM \ Events :: prePersist)、$ this);

$ evm- > addEventListener array ORM \ Events :: postPersist ORM \ Events :: postUpdate $ this ;

// $ evm-> addEventListener(array(ORM \ Events :: preUpdate)、$ this);

// $ evm-> addEventListener(array(ORM \ Events :: postUpdate)、$ this);

// $ evm-> addEventListener(array(ORM \ Events :: postLoad)、$ this);

// $ evm-> addEventListener(array(ORM \ Events :: loadClassMetadata)、$ this);

// $ evm-> addEventListener(array(ORM \ Events :: onFlush)、$ this);

}



パブリック 関数 postPersist Common \ EventArgs $ e

{

\ Doctrine \ Common \ Util \ Debug :: dump $ e- > getEntity ;

echo __METHOD__ ;

}



パブリック 関数 postUpdate Common \ EventArgs $ e

{

echo __METHOD__ ;

}





}


$ entityModelsには、システム内の既存のモジュールのリストが含まれます;モジュールをロードするために、Frontcontrollerプラグインリソースで同じメカニズムが使用されます。

$ options ['connection']-Doctrine2のデータベース接続パラメーター。

スキーマを生成するとき、Doctrine2はModuleName / Modelフォルダーでデータを探し、モデルクラスのphp-docに基づいてデータベースのスキーマを使用します。



コントローラーの作成と新しいモデルオブジェクトの作成例。



  1. <?php
  2. 名前空間カタログ;
  3. Zend \ Controllerを使用します
  4. Core \ Model \ Entityを使用します。
  5. カタログ\モデルを使用します。
  6. クラス IndexController Controller \ Actionを拡張します
  7. {
  8. パブリック 関数 init
  9. {
  10. / *ここでアクションコントローラを初期化します* /
  11. }
  12. パブリック 関数 indexAction {
  13. $ product = new Model \ Product ;
  14. $ product- > setName 'test' ;
  15. $ product- > setSku ' test'。mktime ;
  16. / * @var $ em Doctrine \ ORM \ EntityManager * /
  17. $ em = $ this- > getInvokeArg 'bootstrap' -> getResource 'doctrine2' ;
  18. $ em- > persist $ product ;
  19. $ em- > flush ;
  20. $ this- > _helper- > layout- > setLayout 'layout' ;
  21. }
  22. }




ここではすべてがシンプルで明確でなければなりません。 名前空間カタログの使用が必須であるという事実にのみ注意を払う価値があります。 モジュールの名前です。



製品モデル自体のクラス



  1. <?php
  2. 名前空間 Catalog \ Model ;
  3. Core \ Model \ Entityを使用します。
  4. / **
  5. * @Entity
  6. * @HasLifecycleCallbacks
  7. * @Table(name = "catalog_product")
  8. * /
  9. クラス Product Model \ Entity {を 拡張します
  10. / **
  11. * @var integer
  12. * @Id @Column(type = "integer")
  13. * @GeneratedValue(ストラテジー= "AUTO")
  14. * /
  15. プライベート $ id ;
  16. / **
  17. * @var string
  18. * @Column(タイプ= "文字列"、長さ= 255)
  19. * /
  20. プライベート $名 ;
  21. / **
  22. * @var string
  23. * @Column(type = "string"、length = 255、unique = true、nullable = false)
  24. * /
  25. プライベート $ sku ;
  26. / **
  27. * @var string
  28. * @Column(type = "datetime"、nullable = true)
  29. * /
  30. private $ created ;
  31. / **
  32. * @var string
  33. * @Column(type = "datetime"、nullable = true)
  34. * /
  35. プライベート $が更新されました
  36. / **
  37. * @return integer $ id
  38. * /
  39. パブリック 関数 getId {
  40. $ this- > idを 返し ます。
  41. }
  42. / **
  43. * @return string $名
  44. * /
  45. パブリック 関数 getName {
  46. return $ this- > getProperty 'name' ;
  47. }
  48. / **
  49. * @param string $ name設定する$ name
  50. * /
  51. パブリック 関数 setName $ name {
  52. $ this- > name = $ name ;
  53. $ thisを 返し ます。
  54. }
  55. / **
  56. * @return string作成された$
  57. * /
  58. / **
  59. * @ $ skuを返す
  60. * /
  61. パブリック 関数 getSku {
  62. return $ this- > getProperty 'sku' ;
  63. }
  64. / **
  65. * @param $ sku設定する$ sku
  66. * /
  67. パブリック 関数 setSku $ sku {
  68. $ this- > sku = $ sku ;
  69. $ thisを 返し ます。
  70. }
  71. パブリック 関数 getCreated {
  72. return $ this- > getProperty 'created' ;
  73. }
  74. / **
  75. * @param $ created $を作成して設定
  76. * /
  77. パブリック 関数 setCreated $ created {
  78. $ this- > created = $ created ;
  79. $ thisを 返し ます。
  80. }
  81. / **
  82. * @更新された$を返す
  83. * /
  84. パブリック 関数 getUpdated {
  85. return $ this- > getProperty 'updated' ;
  86. }
  87. / **
  88. * @param $は$を更新し、設定するために更新されました
  89. * /
  90. パブリック 関数 setUpdated $ updated {
  91. $ this- > updated = $ updated ;
  92. $ thisを 返し ます。
  93. }
  94. }




繰り返しますが、名前空間カタログ\モデル; モデルクラスの必須命令。



私の考え-私はそれがすべて好きです。 PHPは、企業セクターの言語として、もう1つのノッチを上げました。




All Articles