doctrine orm — загрузка не работает корректно с помощью autoloader.php в каталоге vendor

У меня проблемы с автозагрузкой композитора, поскольку автозагрузчик не может разрешить Doctrine \ ORM \ Mapping \ Table.
Для юнит-тестов я создал классы сущностей учения с типичными аннотациями:

<?php

namespace OmniSearchTest\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Picture
*
* @ORM\Table(name="picture")
* @ORM\Entity
*/
class Picture
{

и создал новый менеджер сущностей, используя эти сущности. Но я получаю сообщение:

Doctrine\Common\Annotations\AnnotationException: [Semantical Error] The annotation "@Doctrine\ORM\Mapping\Table" in class OmniSearchTest\Entity\Picture does not exist, or could not be auto-loaded.

Для некоторых юниттестов

Во-первых, у меня есть следующая структура проекта:

/src
/OmniSearch
SomeClass.php
/tests
/OmniSearchTest
SomeClassTest.php
/composer.json
/phpunit.xml.dist

Мой composer.json выглядит так:

{
/* ... */

"require": {
"php": ">=5.4",
"doctrine/orm": "2.*"},
"require-dev": {
"phpunit/phpunit": "4.*"},
"autoload": {
"psr-0": {
"OmniSearch\\": "src/"}
},
"autoload-dev": {
"psr-0": {
"OmniSearchTest\\": "tests/"}
}
}

В то время как мой phpunit выглядит именно так:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"backupStaticAttributes="false"bootstrap="vendor/autoload.php"strict="true"verbose="true">
<testsuites>
<testsuite name="omnisearch">
<directory>./tests/OmniSearchTest</directory>
</testsuite>
</testsuites>
</phpunit>

Я отключил этот проект от другого моего проекта zf2, где автозагрузка работала нормально. Я не уверен, что именно пошло не так, потому что автоматически сгенерированный autoload_namespaces.php содержит отображение:

'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),

6

Решение

Это своего рода выстрел в темноте, но приложения Symfony 2 включают файл autoload.php, который явно загружает реестр аннотаций.

// autoload.php
use Doctrine\Common\Annotations\AnnotationRegistry;
use Composer\Autoload\ClassLoader;

/**
* @var ClassLoader $loader
*/
$loader = require __DIR__.'/../vendor/autoload.php';

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;

Я никогда не исследовал, почему в деталях, так как я не использую аннотации. Но попробуйте. Не повредит.

14

Другие решения

Это немного устарело, но я создал плагин composer, который регистрирует Comloser ClassLoader в AnnotationRegistry в качестве загрузчика.

https://github.com/indigophp/doctrine-annotation-autoload

3