2014-09-19 9 views
6

Ich habe Trouble mit der Autoloader von Composer als der Autoloader kann Doctrine \ ORM \ Mapping \ Table nicht auflösen. Für die Unittests i Lehre Entitätsklassen mit typischen Anmerkungen erstellt haben:Autoloading funktioniert nicht korrekt mit Autoloader.php im Lieferantenverzeichnis

<?php 

namespace OmniSearchTest\Entity; 

use Doctrine\ORM\Mapping as ORM; 

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

und erstellt eine neue Entität Manager durch diese Entitäten verwendet werden. Aber im immer die Meldung:

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. 

Für einige Unittests

Zuerst habe ich die folgende Projektstruktur:

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

Meine composer.json wie folgt aussieht:

{ 
    /* ... */ 

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

Während mein phpunit genau so aussieht:

<?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> 

Ich habe dieses Projekt von einem anderen ZF2-Projekt von mir geschnitten, wo das Autoloading gut funktionierte. Ich bin nicht sicher, was genau schief gelaufen ist, weil das automatisch generiert autoload_namespaces.php die die Abbildung enthält:

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

Antwort

13

Dies ist eine Art von einem Schuss in den dunklen, aber Symfony 2-Anwendungen gehören autoload.php Datei, die explizit eine Anmerkung Register lädt .

// 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; 

Ich recherchierte nie wirklich, warum im Detail, da ich keine Anmerkungen verwende. Aber versuchen Sie es. Kann nicht weh tun.

+0

whohaaaa, du hast Recht ... Ich habe eine bootstrap.php in tests Verzeichnis erstellt und die phpunit.xml ändern diese Datei – torsten

+1

Bootstrap Und ich einfach Komponisten autoload.php von ' Vendor'-Verzeichnis und es funktionierte (ich benutze nicht einmal bootstrap.php): '$ loader = require_once __DIR __. '/ vendor/autoload.php'; AnnotationRegistry :: registerLoader (array ($ loader, 'loadClass')); ' –