автоматическая загрузка не работает корректно с помощью автозапуска.php в каталоге поставщиков


У меня проблем с автозагрузкой композитора как автозагрузчик не может разрешить доктринаОРМ отображениятаблицы. Для Unittests я создал классы сущностей доктрины с типичными аннотациями:

<?php

namespace OmniSearchTestEntity;

use DoctrineORMMapping as ORM;

/**
 * Picture
 *
 * @ORMTable(name="picture")
 * @ORMEntity
 */
class Picture
{

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

DoctrineCommonAnnotationsAnnotationException: [Semantical Error] The annotation "@DoctrineORMMappingTable" in class OmniSearchTestEntityPicture does not exist, or could not be auto-loaded.

Для некоторых unittest

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

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

Мой композитор.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'),
2 6

2 ответа:

Это своего рода выстрел в темноте, но приложения Symfony 2 включают автоматическую загрузку.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;

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

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

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