Php doctrine2中使用事务方法的显式事务

Php doctrine2中使用事务方法的显式事务,php,doctrine-orm,zend-framework2,Php,Doctrine Orm,Zend Framework2,我尝试使用EntityManager::transactional(函数($em){})实现简单的表单处理方法。看起来很简单,但问题是:如何将附加值传递给这样的实现?确切地说,我想做以下几点 $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $request = $this->getRequest(); $form = new BugForm(); $form->get('repor

我尝试使用
EntityManager::transactional(函数($em){})实现简单的表单处理方法。看起来很简单,但问题是:如何将附加值传递给这样的实现?确切地说,我想做以下几点

$em  = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
$request = $this->getRequest();
$form = new BugForm();
$form->get('reporter')->setValueOptions(
    $em->getRepository('Application\Entity\Person')->getPersonListArray()
);
$form->get('engineer')->setValueOptions(
    $em->getRepository('Application\Entity\Person')->getPersonListArray()
);
$form->get('products')->setValueOptions(
    $em->getRepository('Application\Entity\Product')->getProductListArray()
);
$confirmation = "";

if($request->isPost()) {
    $em->transactional(function($em) {
        $form = new BugForm();
        $request = $this->getRequest();
        $form->setData($request->getPost());
        if($form->isValid()) {
            $form = new BugForm();
            $hydrator = new DoctrineHydrator($em);
            $data = $form->getData();
            $data['created'] = time();
            $data['status'] = 'OPEN';
            $bug = $hydrator->hydrate($data, new Bug());

            $em->persist($bug);
            $em->flush();
            $confirmation = "Created bug with ID ".$bug->getId()."<br/>";
        }
    });
}

return array(
    'form'         => $form,
    'confirmation' => $confirmation
);
$em=$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
$request=$this->getRequest();
$form=新的BugForm();
$form->get('reporter')->setValueOptions(
$em->getRepository('Application\Entity\Person')->getPersonListArray()
);
$form->get('engineer')->setValueOptions(
$em->getRepository('Application\Entity\Person')->getPersonListArray()
);
$form->get('products')->setValueOptions(
$em->getRepository('Application\Entity\Product')->getProductListArray()
);
$confirmation=“”;
如果($request->isPost()){
$em->事务性(功能($em){
$form=新的BugForm();
$request=$this->getRequest();
$form->setData($request->getPost());
如果($form->isValid()){
$form=新的BugForm();
$hydrator=新的医生水合器($em);
$data=$form->getData();
$data['created']=time();
$data['status']='OPEN';
$bug=$hydrator->hydrate($data,new bug());
$em->persist($bug);
$em->flush();
$confirmation=“创建了ID为“$bug->getId()”的bug
”; } }); } 返回数组( 'form'=>$form, “确认”=>$confirmation );

问题是,
this->getRequest()
匿名函数中的调用没有创建数据,因此我无法填充BugForm对象。当然,我可以在那里使用superglobal
\u POST
数组,但在匿名函数中使用
$this
似乎不太合适,您需要使用PHP5.4或更高版本。您还可以通过使用
use
语言构造使父作用域中的
$request
在闭包的作用域中可用来解决问题,如下所示:

$em->transactional(function($em) use ($request) {
    $form = new BugForm();
    $form->setData($request->getPost());
    if($form->isValid()) {
        $form = new BugForm();
        $hydrator = new DoctrineHydrator($em);
        $data = $form->getData();
        $data['created'] = time();
        $data['status'] = 'OPEN';
        $bug = $hydrator->hydrate($data, new Bug());

        $em->persist($bug);
        $em->flush();
        $confirmation = "Created bug with ID ".$bug->getId()."<br/>";
    }
});

要在匿名函数中使用
$this
,需要使用PHP5.4或更高版本。您还可以通过使用
use
语言构造使父作用域中的
$request
在闭包的作用域中可用来解决问题,如下所示:

$em->transactional(function($em) use ($request) {
    $form = new BugForm();
    $form->setData($request->getPost());
    if($form->isValid()) {
        $form = new BugForm();
        $hydrator = new DoctrineHydrator($em);
        $data = $form->getData();
        $data['created'] = time();
        $data['status'] = 'OPEN';
        $bug = $hydrator->hydrate($data, new Bug());

        $em->persist($bug);
        $em->flush();
        $confirmation = "Created bug with ID ".$bug->getId()."<br/>";
    }
});

要在匿名函数中使用
$this
,需要使用PHP5.4或更高版本。您还可以通过使用
use
语言构造使父作用域中的
$request
在闭包的作用域中可用来解决问题,如下所示:

$em->transactional(function($em) use ($request) {
    $form = new BugForm();
    $form->setData($request->getPost());
    if($form->isValid()) {
        $form = new BugForm();
        $hydrator = new DoctrineHydrator($em);
        $data = $form->getData();
        $data['created'] = time();
        $data['status'] = 'OPEN';
        $bug = $hydrator->hydrate($data, new Bug());

        $em->persist($bug);
        $em->flush();
        $confirmation = "Created bug with ID ".$bug->getId()."<br/>";
    }
});

要在匿名函数中使用
$this
,需要使用PHP5.4或更高版本。您还可以通过使用
use
语言构造使父作用域中的
$request
在闭包的作用域中可用来解决问题,如下所示:

$em->transactional(function($em) use ($request) {
    $form = new BugForm();
    $form->setData($request->getPost());
    if($form->isValid()) {
        $form = new BugForm();
        $hydrator = new DoctrineHydrator($em);
        $data = $form->getData();
        $data['created'] = time();
        $data['status'] = 'OPEN';
        $bug = $hydrator->hydrate($data, new Bug());

        $em->persist($bug);
        $em->flush();
        $confirmation = "Created bug with ID ".$bug->getId()."<br/>";
    }
});

我不知道
如何使用
,但将
$confirmation
设置为global时做了一个很糟糕的改动。无论如何,谢谢:)我不知道
如何使用
,但把
$confirmation
设置为global时做了一个很糟糕的改动。无论如何,谢谢:)我不知道
如何使用
,但把
$confirmation
设置为global时做了一个很糟糕的改动。无论如何,谢谢:)我不知道
如何使用
,但把
$confirmation
设置为global时做了一个很糟糕的改动。无论如何,谢谢:)