LoginSignup
4
4

More than 5 years have passed since last update.

ZendFramework2でDoctrine2を使うならEntityは手作りしないで自動生成させよう

Last updated at Posted at 2016-04-05

Doctrine2をインストールしているのに、entityを最初から手作りするだなんて…いけてないよね。
データベースの中にテーブルを作ったら、自動生成してエンティティを作ってもらうほうが正確だしバグもでないんだからツールに頼ろう。

コマンド①は、データベースの中のテーブルからバサッと一気にエンティティらを生成します。

コマンド①

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping --namespace='Application\Entity\' --force  --from-database annotation ./module/Application/src/

続いてコマンド②を実行すると、生成されたエンティティらにGetterやSetterを追加してくれます。

コマンド②

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:generate-entities ./module/Application/src/ --generate-annotations=true

だからといって、生成したものが自分の期待にそっていなければ適宜修正がいるはずですよ。
参考:リレーションシップに関する情報を更新する

例えば私の場合、idはRedis側で生成してそれを渡してレコード書き込みたかったので、その部分をいじったりしました。

データを出力する

クラスはこんな感じで。とりあえずデータが取れます。あくまでもとりあえず…

public function indexAction()
{
    $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    $articles = $em->getRepository('\Application\Entity\Article')->findAll();
    $viewModel =  new ViewModel();
    $viewModel->articles = $articles;
    return $viewModel;
}

ビューには、

index.phtml
<h2>Articles</h2>
<ol>
<?php foreach($articles as $article): ?>
<li>
<a href="<?=$article->getUrl()?>">
<?=$article->getTitle()?></a><br>
<?=$article->getDate()->format('d M Y')?> | <?=$article->getPublisher()->getName()?><br>
</li>
<?php endforeach;?>
</ol>

テストコードなのでエラー出るかも

error_message

Deprecated: You are retrieving the service locator from within the class Application\Controller\IndexController. 
Please be aware that ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0,
along with the ServiceLocatorAwareInitializer. You will need to update your class to accept 
all dependencies at creation, either via constructor arguments or setters, 
and use a factory to perform the injections. 
in /var/www/zf2/vendor/zendframework/zend-mvc/src/Controller/AbstractController.php on line 258

平たく言えば、「Controllerでデータ取得やめておけ。そんなの誰にもすすめてないし。3.0になって廃止されてて動かんようになっても知らんからな。」ということ。これはZendFramework2.5からでてるのか?Doctrine2から出ているのかわからないけど、 …自分もこの過程でちびっとはリビジョンアップしまして、ZendFramework2がDependency Injectionっていう素敵な作りがあってトレンドなんですが、ここはFactoryな感じでDIを実装してしまってやっちまった感があって、それで3.0で廃止するよってことみたいですね。

でもねこれだけは日頃の不満。
スキャフォールディングの悪しき慣習に慣らされて、Model側に実装すべきデータベースとのやり取りを直接コントローラに書いて本番稼働なんてあかんよ。スキャフォールディングは素敵だけど、それはモックに過ぎずデザイナーさんとかフロントエンドエンジニアさんらが頑張って動くようにして、開発に回す前のもの。これを真に受けてコントローラーにビジネスロジックガンガン実装したらあかんよ。ホンマに…でもそんなのばっかり。ったく。

参考記事

ZendFramework2 : Generate Doctrine Entities from Existing Database using DoctrineModule and DoctrineORMModule

IBM : ZendFrameworkとともにDoctrineを使用する

Symfony : 既にあるデータベースからエンティティを生成する方法

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4