2014-06-23 2 views
0

Я пытаюсь реализовать простую обработку формы с использованием подхода EntityManager::transactional(function($em) {});. Кажется довольно простым, но возникает вопрос: как передать дополнительные значения для такой реализации? Чтобы быть точным, я хочу сделать следующееЯвная транзакция в доктрине2 с использованием транзакционного метода

$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 
); 

Проблема в том, что this->getRequest() вызов в анонимной функции не создает данных, так что я не в состоянии заполнить объект BugForm. Конечно, я мог бы просто использовать суперглобальный массив _POST, но он не кажется правильным ...

ответ

3

Чтобы использовать $this в анонимной функции, вам нужно использовать PHP 5.4 или новее. Вы также можете решить вашу проблему, сделав $request из родительской области, доступной в рамках закупоривающих путем использования use языка построения, например, так:

$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 переменных в замыкании находится в другой области с переменной $confirmation, возвращаемой в родительской функции. Для того, чтобы изменить $confirmation переменные в родительской области, вы должны сделать это имеющееся путем ссылки в рамках закупоривающих:

$em->transactional(function($em) use ($request, &$confirmation) { 
+0

я не знал о 'use' но сделали некрасивый хак с установкой' $ confirmation' к Глобальный. В любом случае, спасибо :) – Moby04

Смежные вопросы