PHP
ZendFramework
doctrine
zf2

Zend Framework 2 に Doctrine 2 ORM を導入する

More than 1 year has passed since last update.

Doctrine 及び zf2 開発者の Marco Pivetta 氏によるこちらのプレゼンテーションが大変参考になります。
http://marco-pivetta.com/doctrine-orm-zf2-tutorial/#/

インストール

composer を使い ZendDeveloperToolsDoctrineORMModule を導入します。

composer require zendframework/zend-developer-tools:dev-master
composer require doctrine/doctrine-orm-module

zf2のモジュールとして追加

プロジェクトにモジュールを組み込みます。

config/application.config.php
    'modules' => array(
        'ZendDeveloperTools',
        'DoctrineModule',
        'DoctrineORMModule',
        'Application'
    ),

標準の設定をインポート

ZendDeveloperTool の設定ファイルを取り込みます。

cp vendor/zendframework/zend-developer-tools/config/zenddevelopertools.local.php.dist config/autoload/zdt.local.php

エンティティクラス作成

データを保持するクラスを作ります。
PHP の情報だけでは足りませんので、メタデータをコメント内に書き込みます。

module/Application/src/Application/Entity/User
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class User {
    /**
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    * @ORM\Column(type="integer")
    */
    protected $id;

    /** @ORM\Column(type="string") */
    protected $fullName;

    // getter や setter を以下に書く
}

マッピング

ORM のマッピング設定を、モジュール設定に加えます。

module/Application/config/module.config.php
'doctrine' => array(
  'driver' => array(
    'application_entities' => array(
      'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
      'cache' => 'array',
      'paths' => array(__DIR__ . '/../src/Application/Entity')
    ),

    'orm_default' => array(
      'drivers' => array(
        'Application\Entity' => 'application_entities'
      )
   )
)

確認

web サーバを起動してみます。

cd public
php -S 0.0.0.0:3000 index.php

スクリーンショット 2014-12-03 15.33.38.png

ブラウザでアクセスすると、 ZendDeveloperTools の力によって、フッタにプロファイル情報が出ますが、その右の方に Doctrine ORM の情報が出ます。

DBと接続

接続設定

DB接続情報をプロジェクトに加えます。

config/autoload/doctrine.local.php
return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver',
        'params' => array(
          'host'     => 'localhost',
          'port'     => '3306',
          'user'     => 'username',
          'password' => 'password',
          'dbname'   => 'database',
)))));

スキーマ検証

スキーマを検証します。
Doctrineモジュールに関わる操作は、コマンドラインツール doctrine-module を利用します。

./vendor/bin/doctrine-module orm:validate-schema

テーブル作成

DBにテーブルを作成します。
DBの起動、接続先DBの作成を忘れないようにしましょう。

./vendor/bin/doctrine-module orm:schema-tool:create

確認

コントローラに書いたコードで、動作確認して終了です。
setFullName() などの getter, setter はエンティティクラスに加えるようにしましょう。

module/Application/src/Application/Controller/IndexController.php
public function indexAction() {
    $objectManager = $this
        ->getServiceLocator()
        ->get('Doctrine\ORM\EntityManager');

    $user = new \Application\Entity\User();
    $user->setFullName('Marco Pivetta');

    $objectManager->persist($user);
    $objectManager->flush();

    var_dump($user->getId()); 
}

その他参考

Doctrine の使い方
http://docs.sympony.gr.jp/symfony2/book/doctrine.html