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
그렇게 할 수있는 더 좋은 방법이있을 수 있지만, 그것을 만들기에 충분했다 나를 위해 일해.
A의를 공유 번들을 사용하면이 작업이 올바르게 수행됩니다. 다른 옵션은 수동으로 매핑을 설정하는 것입니다. cmf 문서에서 설명합니다 : http://symfony.com/doc/master/cmf/bundles/phpcr_odm.html#doctrine-phpcr-odm-configuration – dbu
내가 그 문서에서 놓쳤던 무엇인가 인 것은 그것이었습니다. 이제 이해가됩니다! – futureal