2014-09-19 14 views
6

ho troube con l'autoloading del compositore in quanto il caricatore automatico non può risolvere Doctrine \ ORM \ Mapping \ Table. Per i Unittests ho creato classi di entità dottrina con annotazioni tipici:autloading non funziona correttamente utilizzando autoloader.php nella directory del fornitore

<?php 

namespace OmniSearchTest\Entity; 

use Doctrine\ORM\Mapping as ORM; 

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

e ha creato un nuovo gestore di entità usando questa entità. Ma im ottenere il messaggio:

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. 

Per alcuni Unittests

In primo luogo, ho la seguente struttura del progetto:

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

mio composer.json si presenta così:

{ 
    /* ... */ 

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

Mentre la mia phpunit appare così:

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

Ho tagliato questo progetto da un altro mio progetto zf2 in cui l'autoloading funzionava correttamente. Non sono sicuro che cosa esattamente è andato storto perché l'autoload_namespaces.php generato automaticamente contiene la mappatura:

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

risposta

13

Questa è una specie di salto nel buio, ma Symfony 2 applicazioni includono un file autoload.php che carica esplicitamente un registro di annotazione .

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

Non ho mai studiato il motivo per cui in qualsiasi dettaglio poiché non uso annotazioni. Ma provalo. Non posso far male

+0

whohaaaa, hai ragione ... Ho creato un bootstrap.php nella directory di test e modificare il phpunit.xml di bootstrap questo file – torsten

+1

e ho semplicemente utilizzare autoload.php del compositore da ' directory del venditore e ha funzionato (non utilizzo nemmeno bootstrap.php): '$ loader = require_once __DIR __. '/ vendor/autoload.php'; AnnotationRegistry :: registerLoader (array ($ loader, 'loadClass')); ' –

Problemi correlati