2013-10-20 3 views
0

PHPCR-ODM을 기존 Symfony 프로젝트와 통합하려고 시도하고 매핑 된 문서 클래스를 (아마도) 감지하는 데 문제가 있습니다. 내 클래스 MyDocument의 문서를 지속 할 때 특히,이 같은 오류가 발생합니다 :Symfony에서 Doctrine PHPCR-ODM 매핑 된 문서 클래스를 감지하지 못합니다.

[Doctrine\Common\Persistence\Mapping\MappingException]                    
The class 'Example\Common\ORM\Document\MyDocument' was not found in the chain configured namespaces Doctrine\ODM\PHPCR\Document 

이 프로젝트뿐만 아니라 교리 ORM을 사용하기 때문에 내 클래스는 잠재적으로 이상한 네임 스페이스에 있으며, 지금까지 난 그냥했습니다 매핑 된 문서를위한 새로운 공간을 추가했지만 네임 스페이스 이름의 선택이 기능에 영향을 미쳤다는 것을 상상할 수 없습니다. 워드 프로세서 당

, 나는 내 응용 프로그램/autoload.php에 추가 한 :

:

AnnotationRegistry::registerFile(__DIR__.'/../vendor/doctrine/phpcr-odm/lib/Doctrine/ODM/PHPCR/Mapping/Annotations/DoctrineAnnotations.php'); 

내 애플/설정/config.yml이 (parameters.yml에 설정된 매개 변수) 다음을 포함한다

doctrine_phpcr: 
    session: 
     backend: 
      type: jackrabbit 
      url: %jackrabbit_url% 
     workspace: %jackrabbit_workspace% 
     username: %jackrabbit_user% 
     password: %jackrabbit_password% 
    odm: 
     auto_mapping: true 

내 문서 클래스는 SRC에 살고/예/공통/ORM/문서/MyDocument.php과 같습니다

<?php 

namespace Example\Common\ORM\Document; 

use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM; 

/** 
* @PHPCRODM\Document 
*/ 
class MyDocument 
{ 
    /** 
    * @PHPCRODM\Id 
    */ 
    private $id; 

    /** 
    * @PHPCRODM\ParentDocument 
    */ 
    private $parent; 

    /** 
    * @PHPCRODM\Nodename 
    */ 
    private $name; 

    // .. etc 

F inally, 내가 통합을 테스트하기 위해 사용하고있는 코드는 간단한 콘솔 명령 안에, 그리고 다음과 같습니다 내 MyDocument 클래스가 올바르게로드되고 있음을 확인했습니다

use Example\Common\ORM\Document\MyDocument; 

// ... 

$documentManager = $this->container->get('doctrine_phpcr.odm.default_document_manager'); 

$document = new MyDocument(); 
$document->setParent($documentManager->find(null, '/')); 
$document->setName('ExampleName'); 

$documentManager->persist($document); 
$documentManager->flush(); 

하지만 주석이되지 않는 것 같다 DocumentManager가 매핑 된 Document 클래스임을 인식하게하는 방식으로 처리됩니다.

내 생각 엔 몇 가지 간단한 구성 단계를 간과했지만, PHPCR, PHPCR-ODM 및 Symfony CMF에 대한 문서를 반복적으로보고 철저히 검토 한 결과 아무것도 찾을 수없는 것 같습니다. 대부분의 예제는 Symfony CMF를 통한 PHPCR 사용과 관련되어 있으며, 정기적 인 Symfony 프로젝트에 PHPCR-ODM의 많은 실제 사례를 찾을 수 없었습니다.


편집 : 최종 솔루션

나는 @WouterJ 아래 준 조언을 따라 내 문제를 해결하고, 내가 더 내 심포니 만들기 위해 번들에 컴파일러 패스를 추가하는 자신의 제안을 따라 이 작품은 비표준 네임 스페이스 (즉, YourBundle\Document 이외의 다른 것)를 사용합니다. 필자의 경우, 이것은 번들이 아닌 다른 곳에서 재사용 될 라이브러리로 들어가므로 적합하다.

이 작업을 수행하려면, 그래서 같은 src/Example/Bundle/ExampleBundle/ExampleBundle.php 파일에 메서드를 추가 :

<?php 

namespace Example\Bundle\ExampleBundle; 

use Doctrine\Bundle\PHPCRBundle\DependencyInjection\Compiler\DoctrinePhpcrMappingsPass; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\HttpKernel\Bundle\Bundle; 

class ExampleBundle extends Bundle 
{ 
    public function build(ContainerBuilder $container) 
    { 
    parent::build($container); 

    $mappedDirectories = array(
     realpath(__DIR__ . '/../../Common/ODM/Document') 
    ); 

    $mappedNamespaces = array(
     'Example\Common\ODM\Document' 
    ); 

    $phpcrCompilerClass = 'Doctrine\Bundle\PHPCRBundle\DependencyInjection\Compiler\DoctrinePhpcrMappingsPass'; 
    if (class_exists($phpcrCompilerClass)) { 
     $container->addCompilerPass(
      DoctrinePhpcrMappingsPass::createAnnotationMappingDriver(
       $mappedNamespaces, 
       $mappedDirectories 
     )); 
    } 
    } 
} 

을 그 코드가 매핑 된 문서 클래스는 예 \ 공통 \ ODM \ 문서 네임 스페이스에 배치 할 수 있도록하고 선택할 것 그들을 위로. 이 예제에서는 주석을 사용하지만 XML 또는 YAML 매핑에 동일한 패턴을 사용할 수 있습니다 (메서드 서명의 경우 Doctrine\Bundle\PHPCRBundle\DependencyInjection\Compiler\DoctrinePhpcrMappingsPass 클래스 참조).

나는 또한 내가 app/config.yml에서했던이 작업을하기 위해 doctrine_phpcr.odm.metadata.annotation_reader 서비스를 정의하는 데 필요한 것을 발견 :

services: 
    doctrine_phpcr.odm.metadata.annotation_reader: 
     class: Doctrine\Common\Annotations\AnnotationReader 

그렇게 할 수있는 더 좋은 방법이있을 수 있지만, 그것을 만들기에 충분했다 나를 위해 일해.

+0

A의를 공유 번들을 사용하면이 작업이 올바르게 수행됩니다. 다른 옵션은 수동으로 매핑을 설정하는 것입니다. cmf 문서에서 설명합니다 : http://symfony.com/doc/master/cmf/bundles/phpcr_odm.html#doctrine-phpcr-odm-configuration – dbu

+0

내가 그 문서에서 놓쳤던 무엇인가 인 것은 그것이었습니다. 이제 이해가됩니다! – futureal

답변

1

문서는 ORM \ Document 네임 스페이스가 아닌 문서 네임 스페이스에 배치해야합니다.

당신은 정말, 당신은 교리 매핑 컴파일러 패스를 사용할 수있다 (우리는 ODM 아닌 ORM에 대해 이야기하고 있기 때문에, 아주 이상한 임) ORM의 \ 문서 네임 스페이스에 넣어하려면 : http://symfony.com/doc/current/cookbook/doctrine/mapping_model_classes.html

+0

빠른 응답을 보내 주셔서 감사합니다! 당신은 맞습니다. 이상한 곳입니다. 나는 이것을 테스트하기 위해 거기에 놓았 기 때문에 나머지 엔티티 (ORM \ Model 또는 그 근처)와 함께 놓았습니다. 코드로 마을에 가기 전에 Symfony, Doctrine, Jackrabbit 사이에 약간의 개념 증명을하고 싶었습니다. 나는 지금 당장이 사진을 줄 것이다. – futureal

관련 문제