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
Post a Comment