2014-12-10 3 views
0

이상한 동작을 보이는 mongodb & doctrine-odm과 Symfony2를 사용하고 있습니다. 나는 importFile 문서와 컨텍스트 문서를 가지고있다. contexte 문서는 다음과 같이 importFile 문서로 참조됩니다.Symfony2 Mongodb : 다른 객체에 객체 저장

/** 
* @MongoDB\Document 
*/ 
class ImportFile 
{ 
[...] 
/** 
* @MongoDB\ReferenceOne(targetDocument="Contexte") 
*/ 
private $contexte; 

(getter 및 setter는 ok입니다.)

내 contexte 문서가 이미 존재하며 세션에 남아 있습니다. 컨텍스트 개체를 덤프하는 경우 모든 필수 개체 정보, 그의 ID 및 모든 속성이 있습니다. 내 컨트롤러에서

, 내 importFile 하나에이 contexte 객체를 저장할 : 그것은 매우 간단 보인다

$dm = $this->getDocumentManager(); 
$importFile->setContexte($contexte); // contexte object already exists and persisted 
$dm->persist($importFile); 
$dm->flush(); 

하고,해야 그런 식으로 작동하지만, 플러시에, 나는 MongoDB의 오류를 얻을 :

식별자없이 DBRef를 만들 수 없습니다. UnitOfWork :: getDocumentIdentifier()가 Contex 클래스의 식별자를 반환하지 않았습니다.

내가 잘못하고있는 것을 알지 못합니다. 어떤 도움이 필요합니까?

답변

0

당신은 개체를 검색 할 때 어쩌면,

0

어쩌면 누군가 도움이 될 것입니다 단지 널 (null) 인 위해서 var_dump ($ importFile)을 수행하지 않았습니다.

제 경우에는 유효성 검사 후 ZF2가 빈 문자열을 식별자로 반환합니다.

Doctrine은 기본값이 NULL 인 경우에만 새 식별자를 생성합니다. https://github.com/doctrine/mongodb-odm/blob/master/lib/Doctrine/ODM/MongoDB/UnitOfWork.php#L1017. (주석 참조) 내 코드의

간단한 예 :

namespace Ageme\Project\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Doctrine\ODM\MongoDB\DocumentManager; 

class ProjectController extends AbstractActionController { 
//... 

    protected function saveAction() { 
     /** @var DocumentManager $dm */ 
     $request = $this->getRequest(); 
     $route = $this->getEvent()->getRouteMatch(); 

     $sm = $this->getServiceLocator(); 
     $fm = $sm->get('FormElementManager'); 
     $dm = $sm->get('doctrine.documentmanager.odm_default'); 

     $project = ($project = $dm->find('Ageme\Project\Document\Project', $route->getParam('id'))) 
      ? $project 
      : $sm->get('Ageme\Project\Document\Project'); 

     $form = $fm->get('Ageme\Project\Form\ProjectForm'); 
     $form->bind($project); 

     if ($request->isPost()) { 
      $form->setData($request->getPost()); 
      if ($form->isValid()) { 
       // after validation $project->getId() === '', 
       // but for new object must equal $project->getId() === null 
       $sm->get('ProjectService')->run('save', $project); 
       $this->flashMessenger()->addSuccessMessage('Project saved'); 
       $this->redirect()->toRoute('default', 
       ['controller' => $route->getParam('controller'), 'lang' => $route->getParam('lang')] 
       ); 
      } 
     } 

     return new ViewModel([ 
      'form' => $form, 
     ]); 
    } 
    //... 
} 

나는 내 문제를 해결하기 위해 다음 필터를 추가

namespace Ageme\Project\Form; 

use Zend\Form\Fieldset; 
use Zend\InputFilter\InputFilterProviderInterface; 

use DoctrineModule\Persistence\ProvidesObjectManager; 
use DoctrineModule\Persistence\ObjectManagerAwareInterface; 

class ProjectFieldset 
    extends Fieldset 
    implements InputFilterProviderInterface, ObjectManagerAwareInterface { 

    use ProvidesObjectManager; 

    public function init() { 
     $this->setName('project') 
      ->setAttributes(['id' => 'project']); 

     $this->add([ 
      'type' => 'Zend\Form\Element\Hidden', 
      'name' => 'id' 
     ]); 
     //... 
    } 

    public function getInputFilterSpecification() { 
     return [ 
      'id' => [ 
       'required' => true, 
       'allow_empty' => true, 
       'filters' => [ 
        [ 
         "name" => "Callback", 
         "options" => [ 
          "callback" => function ($input) { 
            return $input ?: null; // this code return correct value 
          } 
         ] 
        ] 
       ], 
      ], 
      //...   
     ]; 
    } 
} 
관련 문제