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に基づいてデータベースのスキーマを使用します。
コントローラーの作成と新しいモデルオブジェクトの作成例。
- <?php
- 名前空間カタログ;
- Zend \ Controllerを使用します。
- Core \ Model \ Entityを使用します。
- カタログ\モデルを使用します。
- クラス IndexController は Controller \ Actionを拡張します
- {
- パブリック 関数 init ( )
- {
- / *ここでアクションコントローラを初期化します* /
- }
- パブリック 関数 indexAction ( ) {
- $ product = new Model \ Product ( ) ;
- $ product- > setName ( 'test' ) ;
- $ product- > setSku ( ' test'。mktime ( ) ) ;
- / * @var $ em Doctrine \ ORM \ EntityManager * /
- $ em = $ this- > getInvokeArg ( 'bootstrap' ) -> getResource ( 'doctrine2' ) ;
- $ em- > persist ( $ product ) ;
- $ em- > flush ( ) ;
- $ this- > _helper- > layout- > setLayout ( 'layout' ) ;
- }
- }
ここではすべてがシンプルで明確でなければなりません。 名前空間カタログの使用が必須であるという事実にのみ注意を払う価値があります。 モジュールの名前です。
製品モデル自体のクラス
- <?php
- 名前空間 Catalog \ Model ;
- Core \ Model \ Entityを使用します。
- / **
- * @Entity
- * @HasLifecycleCallbacks
- * @Table(name = "catalog_product")
- * /
- クラス Product は Model \ Entity {を 拡張します
- / **
- * @var integer
- * @Id @Column(type = "integer")
- * @GeneratedValue(ストラテジー= "AUTO")
- * /
- プライベート $ id ;
- / **
- * @var string
- * @Column(タイプ= "文字列"、長さ= 255)
- * /
- プライベート $名 ;
- / **
- * @var string
- * @Column(type = "string"、length = 255、unique = true、nullable = false)
- * /
- プライベート $ sku ;
- / **
- * @var string
- * @Column(type = "datetime"、nullable = true)
- * /
- private $ created ;
- / **
- * @var string
- * @Column(type = "datetime"、nullable = true)
- * /
- プライベート $が更新されました 。
- / **
- * @return integer $ id
- * /
- パブリック 関数 getId ( ) {
- $ this- > idを 返し ます。
- }
- / **
- * @return string $名
- * /
- パブリック 関数 getName ( ) {
- return $ this- > getProperty ( 'name' ) ;
- }
- / **
- * @param string $ name設定する$ name
- * /
- パブリック 関数 setName ( $ name ) {
- $ this- > name = $ name ;
- $ thisを 返し ます。
- }
- / **
- * @return string作成された$
- * /
- / **
- * @ $ skuを返す
- * /
- パブリック 関数 getSku ( ) {
- return $ this- > getProperty ( 'sku' ) ;
- }
- / **
- * @param $ sku設定する$ sku
- * /
- パブリック 関数 setSku ( $ sku ) {
- $ this- > sku = $ sku ;
- $ thisを 返し ます。
- }
- パブリック 関数 getCreated ( ) {
- return $ this- > getProperty ( 'created' ) ;
- }
- / **
- * @param $ created $を作成して設定
- * /
- パブリック 関数 setCreated ( $ created ) {
- $ this- > created = $ created ;
- $ thisを 返し ます。
- }
- / **
- * @更新された$を返す
- * /
- パブリック 関数 getUpdated ( ) {
- return $ this- > getProperty ( 'updated' ) ;
- }
- / **
- * @param $は$を更新し、設定するために更新されました
- * /
- パブリック 関数 setUpdated ( $ updated ) {
- $ this- > updated = $ updated ;
- $ thisを 返し ます。
- }
- }
繰り返しますが、名前空間カタログ\モデル; モデルクラスの必須命令。
私の考え-私はそれがすべて好きです。 PHPは、企業セクターの言語として、もう1つのノッチを上げました。