2014-09-19 19 views
6

Tôi đã thực hiện việc tự động tải của nhà soạn nhạc vì trình nạp tự động không thể giải quyết Doctrine \ ORM \ Mapping \ Table. Đối với unittests tôi đã tạo ra lớp thực thể thuyết với chú thích điển hình:tải tự động không hoạt động chính xác khi sử dụng autoloader.php trong thư mục nhà cung cấp

<?php 

namespace OmniSearchTest\Entity; 

use Doctrine\ORM\Mapping as ORM; 

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

và tạo ra một người quản lý thực thể mới bằng cách sử dụng các đối tượng này. Nhưng im nhận được thông báo:

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. 

Đối với một số unittests

Thứ nhất, tôi có cấu trúc dự án sau:

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

composer.json của tôi trông như thế này:

{ 
    /* ... */ 

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

Trong khi phpunit của tôi trông rất giống như thế này:

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

Tôi đã loại bỏ dự án này khỏi dự án zf2 khác của tôi, nơi quá trình tự động tải hoạt động tốt. Im không chắc chắn chính xác những gì đã xảy ra vì autoload_namespaces.php autogenerated chứa ánh xạ:

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

Trả lời

13

Đây là loại một shot trong bóng tối nhưng Symfony 2 ứng dụng của bao gồm một tập tin autoload.php mà tải một cách rõ ràng một registry chú thích .

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

Tôi chưa bao giờ thực sự nghiên cứu chi tiết vì tôi không sử dụng chú thích. Nhưng hãy thử xem. Không thể đau.

+0

whohaaaa, bạn nói đúng ... tôi đã tạo ra một bootstrap.php trong thư mục kiểm tra và sửa đổi các phpunit.xml để bootstrap file này – torsten

+1

Và tôi chỉ cần sử dụng autoload.php nhà soạn nhạc của từ ' thư mục vendor' và nó hoạt động (tôi thậm chí không dùng bootstrap.php): '$ loader = require_once __DIR __. '/ vendor/autoload.php'; AnnotationRegistry :: registerLoader (mảng ($ loader, 'loadClass')); ' –

Các vấn đề liên quan