(その2から続く)
ではMVCから呼び出してみます。
application/controllers/IndexController.php
<?php class IndexController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // EntityManagerの取得 $container = Zend_Registry::get('doctrine'); $em = $container->getEntityManager(); // Repositoryの取得 $repo = $em->getRepository('Kdf\Entity\User'); // 組み込みメソッド(単数) $user = $repo->findOneBy(array('id'=>1)); $this->view->name = $user->getName(); // 組み込みメソッド(複数) $this->view->all_user = $repo->findAll(); // ユーザ定義メソッド $second_user = $repo->secondUserName(); $this->view->second_user_name = $second_user['name']; } }
plugin(library/Bisna/Application/Resource/Doctrine.php)の中でZend_Registryに登録を行っているのでこれを呼び出してEntityManagerおよびRepositoryを取得します。取得したRepositoryに対してメソッドを発行して目的のデータを取得します。メソッドには組み込み済みのものとユーザー定義のものがあります。ユーザ定義のメソッドはRepositoryクラスに記述します。つまりこれがモデルの核心部分(=ビジネスロジック)になるわけです。(※これに加えてService層を作ることでより一層ビジネスロジックの抽象化を図ることも出来ますね。)
application/models/Kdf/Entity/Repository/UserRepository.php
<?php namespace Kdf\Entity\Repository; use Doctrine\ORM\EntityRepository; /** * UserRepository * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class UserRepository extends EntityRepository { public function secondUserName() { $qb = $this->_em->createQueryBuilder(); $qb->select('u.name') ->from('Kdf\Entity\User', 'u') ->where('u.name = :name') ->setParameter('name', 'ふがふが'); return $qb->getQuery()->getOneOrNullResult(); } }
Repositoryクラスはその2で行ったようにCLIツールでひな形が自動で作成されますのでこの中にメソッドを追加していきます。Repositoryクラスの中から $this->_em でEntityManagerにアクセスできます。EntityManagerを取得した後はQueryBuilderを使うかDQLを直接記述していくことになります。QueryBuilderを使う利点はIDEと組み合わせた場合にコード補完が効くことでしょうか。
application/views/scripts/index/index.phtml
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
findOneBy():</br>
<?= $this->escape($this->name); ?></br></br>
findAll():</br>
<?php foreach ($this->all_user as $key => $val): ?>
<?= $this->escape($val->getName()); ?></br>
<?php endforeach; ?>
</br>
ユーザ定義: </br>
<?= $this->escape($this->second_user_name); ?></br>
</body>
</html>viewの中ではこんな風に値を取得します。
出力結果:
まとめ
Doctrine2の要はEntityManagerです。これとZend Frameworkとの統合という面倒な部分はBisnaライブラリが行ってくれますので、使う側は楽にDoctrine2を使うことが出来ます。
(その4へつづく)

Pingback: Zend Framework1 + Doctrine2 + twigを組み合わせる(その4) | KDF Memo