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

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

# インストール

composer を使い [ZendDeveloperTools](https://github.com/zendframework/ZendDeveloperTools) と [DoctrineORMModule](https://github.com/doctrine/DoctrineORMModule) を導入します。

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

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

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

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

## 標準の設定をインポート

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

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

# エンティティクラス作成

データを保持するクラスを作ります。
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 のマッピング設定を、モジュール設定に加えます。


```php: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](https://qiita-image-store.s3.amazonaws.com/0/12280/b1406b56-b951-6090-176a-f8ec599b9697.png)

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

# DBと接続

## 接続設定

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

```php: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 はエンティティクラスに加えるようにしましょう。

```php: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