2012-04-22 15 views
6

Tôi phải sử dụng \Doctrine\Common\Annotations\AnnotationRegistry::registerFile để truy cập đăng ký chú thích trong tệp thực thể.doctrine2 autloader với cli phải sử dụng AnnotationRegistry

Phần này là bắt buộc để sử dụng chuỗi trình điều khiển và sử dụng orm: schema-tool: creator. nhưng tôi không thể thêm mỗi lớp tôi cần bằng cách thêm AnnotationRegistry::registerFile.

vấn đề này được nhìn thấy khi tôi muốn thêm Gedmo vào Tài liệu của tôi 2.2.2.

// cli-config.php 
// if comment this like an error will appear 
// \Doctrine\Common\Annotations\AnnotationRegistry::registerFile(__DIR__ . '/../library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'); 

// cache 
$cache = new \Doctrine\Common\Cache\ArrayCache(); 

// annotation reader 
$annotationReader = new \Doctrine\Common\Annotations\AnnotationReader(); 

// cached annotation reader 
$cachedAnnotationReader = new \Doctrine\Common\Annotations\CachedReader($annotationReader, $cache); 

// driver chain 
$driverChain = new \Doctrine\ORM\Mapping\Driver\DriverChain(); 

// annotation driver 
$annotationDriver = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($cachedAnnotationReader, array(SCHEMA_PATH)); 

// add entity namespaces 
$driverChain->addDriver($annotationDriver, 'Entity'); 

// configuration 
$config = new \Doctrine\ORM\Configuration(); 
$config->setMetadataCacheImpl($cache); 
$config->setMetadataDriverImpl($driverChain); 
$config->setQueryCacheImpl($cache); 
$config->setProxyDir(PROXY_PATH); 
$config->setProxyNamespace('Proxies'); 
$config->setAutoGenerateProxyClasses(true); 

// entity manager 
$entityManager = \Doctrine\ORM\EntityManager::create($connectionOptions, $config); 

// helper set 
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
      'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($entityManager->getConnection()), 
      'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($entityManager) 
     )); 

// return 
return $helperSet; 

và tập thực thể của tôi nó ở đây

namespace Entity; 

use \Doctrine\Common\Collections\ArrayCollection; 
use \Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
*/ 
class User 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(columnDefinition="INT unsigned NOT NULL") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string",length=32) 
    */ 
    protected $name; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setId($id) 
    { 
     $this->_id = $id; 
     return $this; 
    } 

    public function getName() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->_id = $name; 
     return $this; 
    } 
} 

lỗi là:

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

Trả lời

8

Dường AnnotationRegistry của bạn không được thiết lập.

Thêm dòng sau vào kịch bản của bạn:

use Doctrine\Common\Annotations\AnnotationRegistry; 

AnnotationRegistry::registerFile("/path/to/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php"); 

thấy Doctrine manual on Annotations cho lời giải thích chi tiết.
Tóm lại: để đọc chú thích PSR-0 và tự động tải xuống không thể thực hiện công việc, bạn phải sử dụng giải pháp của chúng.

+0

Nếu bạn đang phát triển một ứng dụng giao diện điều khiển _Symfony 2, bạn nên đặt đoạn mã này theo cách [được giải thích trong câu trả lời này] (http://stackoverflow.com/a/13461155): http://stackoverflow.com/a/ 13461155 – xsubira

-2

Cảm ơn bạn Samuel Herzog. Nó hoạt động hoàn hảo cho tôi. Tôi đã tạo ra các Nhà cung cấp bằng cách sử dụng composer.json. Vì vậy, khi tôi thêm autoload.php của mình, tôi chỉ cần thêm những câu này ...

<?php 
// autoload.php generated by Composer 
use Doctrine\Common\Annotations\AnnotationRegistry; 

require_once dirname(__DIR__).'/vendor/composer/autoload_real.php'; 

$loader = ComposerAutoloaderInit0cf45a42473ebbcd4516460f93747271::getLoader(); 

AnnotationRegistry::registerFile(dirname(__DIR__).'/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'); 

return $loader; 

Cứ như thế.

+4

Vì nó hiển nhiên từ nhận xét, đây là tệp được tạo. Bản chỉnh sửa của bạn có thể/sẽ được ghi đè trong 'bản cài đặt/cập nhật 'tiếp theo. –

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