php - Zend Framework - Doctrine 2 integration : where to store the EntityManager? -


i integrating zend framework , doctrine 2.

the question is, in controllers , view, in need access model. can through single instance of entitymanager.

where store instance ?

  • zend_registry ? that's now, accessible everywhere, not practical : $em = zend_registry::get('entitymanager');
  • as controller , view property ? accessible $this->em, this
  • create factory class return instance ? $em = my\entitymanager\factory::getinstance();. encapsulation good, long type...
  • is entitymanager singleton ? -> (update) not not

i wouldn't recommend using entitymanager directly in controllers , views. instead, use service layer , inject entitymanager that.

i have 2 custom action helpers, 1 retrieve repositories , 1 services. each action hold reference entitymanager , inject accordingly before handing controller.

not actual code (not tested):

my/controller/action/helper/service.php

<?php  namespace my\controller\action\helper;  use doctrine\orm\entitymanager;  class service extends \zend_controller_action_helper_abstract {      private $em;      public function __construct(entitymanager $em)     {         $this->em = $em;     }      public function direct($serviceclass)     {         return new $serviceclass($this->em);     }  } 

you can write similar action helper retrieve repositories.

then, register helper in bootstrap (where have access entitymanager):

<?php  use zend_controller_action_helperbroker helperbroker,     my\controller\action\helper\service;  class bootstrap extends zend_application_bootstrap_bootstrap {      public function _initactionhelpers()     {         $this->bootstrap('doctrine');         $em = $this->getresource('doctrine');          helperbroker::addhelper(new service($em));     }  } 

now write simple service.

my/domain/blog/service/postservice.php

<?php  namespace my\domain\blog\service;  use doctrine\orm\entitymanager,     my\domain\blog\entity\post;  class postservice implements \my\domain\service {      private $em;      public function __construct(entitymanager $em)     {         $this->em = $em;     }      public function createpost($data)     {         $post = new post();         $post->settitle($data['title']);         $post->setcontent($data['content']);          $this->em->persist($post);         $this->em->flush(); // flush can post id          return $post;     }  } 

and bring in controller action:

<?php  class blog_postcontroller extends zend_controller_action {      private $postservice;      public function init()     {         $this->postservice = $this->_helper->service('my\domain\blog\postservice');     }      public function createpostaction()     {         // we'd data actual request         $data = array(             "title" => "stackoverflow great!",             "content" => "imagine i'd without :)"         );         // , validate too!!          $post = $this->postservice->createpost($data);         echo $post->getid(); // blog post should persisted     }  } 

Comments