2012-06-20 139 views
0

我有運行相同的應用程序(Zend公司+學說),5個服務器和最後一臺服務器(最近安裝)IM在我得到這個異常:主義Annotaion異常

Application error Exception information: 

Message: Class Entity\User is not a valid entity or mapped super class. Stack trace: 

#0 /home/library/vendor/doctrine/2.0/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php(138): Doctrine\ORM\Mapping\MappingException::classIsNotAValidEntityOrMappedSuperClass('Entity\User') 
#1 /home/library/vendor/doctrine/2.0/Doctrine/ORM/Mapping/ClassMetadataFactory.php(282): Doctrine\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass('Entity\User', Object(Doctrine\ORM\Mapping\ClassMetadata)) 
#2 /home/library/vendor/doctrine/2.0/Doctrine/ORM/Mapping/ClassMetadataFactory.php(176): Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata('Entity\User') 
#3 /home/library/vendor/doctrine/2.0/Doctrine/ORM/EntityManager.php(247): Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor('Entity\User') 
#4 /home/library/vendor/doctrine/2.0/Doctrine/ORM/EntityManager.php(564): Doctrine\ORM\EntityManager->getClassMetadata('Entity\User') 
#5 /home/imobfusion/public_html/application/modules/a1/controllers/IndexController.php(68): Doctrine\ORM\EntityManager->getRepository('Entity\User') 
#6 /home/library/vendor/zend/1.11.3/Zend/Controller/Action.php(513): A1_IndexController->testDoctrineAction() 
#7 /home/library/vendor/zend/1.11.3/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('testDoctrineAct...') 
#8 /home/library/vendor/zend/1.11.3/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#9 /home/library/vendor/zend/1.11.3/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#10 /home/library/vendor/zend/1.11.3/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#11 /home/imobfusion/public_html/public/index.php(21): Zend_Application->run() 
#12 {main} 

Request Parameters: 

array(3) { ["controller"]=> string(5) "index" ["action"]=> string(13) "test-doctrine" ["module"]=> string(2) "a1" } 

looikng上AnnotationDriver.php( 138):在其他

// Evaluate Entity annotation 
if (isset($classAnnotations['Doctrine\ORM\Mapping\Entity'])) { 
    $entityAnnot = $classAnnotations['Doctrine\ORM\Mapping\Entity']; 
    $metadata->setCustomRepositoryClass($entityAnnot->repositoryClass); 
} else if (isset($classAnnotations['Doctrine\ORM\Mapping\MappedSuperclass'])) { 
    $metadata->isMappedSuperclass = true; 
} else { 
    throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); 
} 

拋出異常

,但我真的不知道會發生什麼!

任何幫助或建議?

觀測值:

  • /家庭/庫/ < -----該文件夾是所有服務器上相同的(相同的);
  • Entity \ User被正確指向並且在兩臺服務器上都是相同的;
  • 我在調用實體管理器上的存儲庫之前禁用了緩存並清除了緩存,並且發生了錯誤!
  • 最後一臺服務器上的PHP版本是5.3.8,在服務器4上(正常運行)是5.3.10。
  • 錯誤發生在應用上的所有(18)實體上,而不僅僅發生在Entity \ User中。

跟蹤我這樣做對我的引導問題(的var_dump(),死亡()):

// AnnotationDriver 
$driver = $config->newDefaultAnnotationDriver($options["entities_dir"]); 
$config->setMetadataDriverImpl($driver); 

var_dump($driver->getAllClassNames()); 
die(); 

而且getAllClassNames()返回一個空數組只有O服務器5,這是錯誤,類不加載在服務器05上,但爲什麼..?測試繼續!

跟蹤的更多,我發現更多的

public function isTransient($className) 
{ 
    $classAnnotations = $this->_reader->getClassAnnotations(new \ReflectionClass($className)); 
     if($className=="Entity\User")   // Debug 
     {          // Debug 
      var_dump($classAnnotations); // Debug 
     }         // Debug 

    return ! isset($classAnnotations['Doctrine\ORM\Mapping\Entity']) && 
      ! isset($classAnnotations['Doctrine\ORM\Mapping\MappedSuperclass']); 
} 
  • 上標註驅動器返回真$ classAnnotations這個方法是一個空數組。
  • 在服務器05上恢復註銷註銷失敗,但是爲什麼!繼續!

Discory的問題,但沒有解決:

我找到了原點,建立這個測試腳本,以確認:

require_once "../application/doctrine/Entity/User.php"; 
$class = new ReflectionClass("Entity\User"); 
echo $class->getName(); 
echo $class->getDocComment(); 

其他服務器上的輸出:

實體\用戶/ ** @Entity * @HasLifecycleCallbacks * @Table(name =「user」) */

服務器05上的輸出:

實體\用戶

- > getDocComment不同意這種especific類和服務器只工作:

用戶類/實體:

<?php 
/** @Entity 
* @HasLifecycleCallbacks 
* @Table(name="user") 
*/ 

namespace Entity; 
use Validation; 
use \DateTime; 
use \LogHelper; 

class User 
{ 

    ///////////////////////////////////////////////////////////////////////// 
    // Properties               // 
    ///////////////////////////////////////////////////////////////////////// 

    /** 
    * @Id 
    * @Column(type="integer") 
    * @generatedValue(strategy="AUTO") 
    */ 
    protected $id; 
    /** 
    * @Column(type="integer") 
    */ 
    protected $type = 0;  
    /** 
    * @Column(length=50) 
    */ 
    protected $name; 
    /** 
    * @Column(length=50) 
    */ 
    protected $user_name; 
    /** 
    * @Column(length=100) 
    */ 
    protected $email; 
    /** 
    * @Column(length=14) 
    */ 
    protected $phone; 
    /** 
    * @Column(length=14) 
    */ 
    protected $cell_phone; 
    /** 
    * @Column(length=36) 
    */ 
    protected $password; 
    /** 
    * @Column(type="text",length=1000) 
    */ 
    protected $permissions; 
    /** 
    * @Column(type="text",length=1000) 
    */ 
    protected $time_table; 
    /** 
    * @Column(type="text",length=1000,nullable=true) 
    */ 
    protected $desktop; 
    /** 
    * @Column(type="boolean",nullable=true) 
    */ 
    protected $chat_on = 0;  
    // Behaviors 

    /** 
    * @Column(type="datetime") 
    */ 
    protected $created_at; 
    /** 
    * @Column(type="datetime") 
    */ 
    protected $updated_at; 
    /** 
    * @Column(type="integer") 
    * @version 
    */ 
    protected $version; 

    ///////////////////////////////////////////////////////////////////////// 
    // Relations               // 
    ///////////////////////////////////////////////////////////////////////// 

    /** 
    * @ManyToOne(targetEntity="Branch", inversedBy="users") 
    * @JoinColumn(name="branch_id", referencedColumnName="id") 
    */ 
    private $branch; 
    /** 
    * @OneToMany(targetEntity="Property", mappedBy="captivator"); 
    */ 
    private $properties; 

    /** 
    * @OneToMany(targetEntity="KeyHistory", mappedBy="user"); 
    */ 
    private $key_histories; 
    /** 
    * @OneToMany(targetEntity="Presentation", mappedBy="user"); 
    */ 
    private $presentations;  
    /** 
    * @OneToMany(targetEntity="Log", mappedBy="user"); 
    */ 
    private $logs; 
    /** 
    * @OneToMany(targetEntity="Chat", mappedBy="user"); 
    */ 
    private $chats;  

    ///////////////////////////////////////////////////////////////////////// 
    // ForeingKey               // 
    ///////////////////////////////////////////////////////////////////////// 

    /** 
    * @Column(type="integer") 
    */ 
    protected $branch_id; 

    ///////////////////////////////////////////////////////////////////////// 
    // Getters/Setters              // 
    ///////////////////////////////////////////////////////////////////////// 

    public function setId($value) {$this->id = $value;} 
    public function getId() {return $this->id;} 
    public function setType($value) {$this->type = $value;} 
    public function getType() {return $this->type;}  
    public function setName($value) {$this->name = $value;} 
    public function getName() {return $this->name;} 
    public function setUserName($value) {$this->user_name = $value;} 
    public function getUserName() {return $this->user_name;} 
    public function setEmail($value) {$this->email = $value;} 
    public function getEmail() {return $this->email;} 
    public function setPhone($value) {$this->phone = $value;} 
    public function getPhone() {return $this->phone;} 
    public function setCellPhone($value) {$this->cell_phone = $value;} 
    public function getCellPhone() {return $this->cell_phone;} 
    public function setPassword($value) {$this->password = $value;} 
    public function getPassword() {return $this->password;} 
    public function setPermissions($value) {$this->permissions = $value;} 
    public function getPermissions() {return $this->permissions;} 
    public function setTimeTable($value) {$this->time_table = $value;} 
    public function getTimeTable() {return $this->time_table;} 
    public function setDesktop($value) {$this->desktop = $value;} 
    public function getDesktop() {return $this->desktop;} 
    public function setChatOn($value) {$this->chat_on = $value;} 
    public function getChatOn() {return $this->chat_on;} 

    public function setBranch($value) {$this->branch = $value;} 
    public function getBranch() {return $this->branch;} 
    public function setBranchId($value) {$this->branch_id = $value;} 
    public function getBranchId() {return $this->branch_id;} 

    public function getCreatedAt() {return $this->created_at->format("d/m/Y H:i:s");} 
    public function getUpdatedAt() {return $this->updated_at->format("d/m/Y H:i:s");} 
    public function getVersion() {return $this->version;} 

    ///////////////////////////////////////////////////////////////////////// 
    // Constructor               // 
    ///////////////////////////////////////////////////////////////////////// 

    public function __construct() 
    { 
     $this->created_at = $this->updated_at = new DateTime("now"); 
    } 

    ///////////////////////////////////////////////////////////////////////// 
    // Hooks                // 
    ///////////////////////////////////////////////////////////////////////// 

    /** 
    * @PrePersist 
    * @PreUpdate 
    */ 
    public function Validate() 
    { 
     $this->ApplyBehaviors(); 

     $e = new ValidationException(); 

     if(empty($this->name)) 
     { 
      $e->AppendError("O Campo nome não pode ser vazio.","name"); 
     } 

     if(empty($this->user_name)) 
     { 
      $e->AppendError("O Campo nome de usuário não pode ser vazio.","user_name"); 
     } 

     if(empty($this->email)) 
     { 
      $e->AppendError("O Campo email não pode ser vazio.","email"); 
     } 

     if($e->hasError()) 
      throw $e; 

    } 



    /** 
    * @PostPersist 
    */ 
    public function onPostPersist() 
    { 
     LogHelper::SaveAction(LogHelper::ACTION_ADD,LogHelper::ENTITY_USER,$this->getId()); 
    } 

    /** 
    * @PostUpdate 
    */ 
    public function onPostUpdate() 
    { 
     LogHelper::SaveAction(LogHelper::ACTION_UPDATE,LogHelper::ENTITY_USER,$this->getId()); 
    } 

    /** 
    * @PreRemove 
    */ 
    public function onPreRemove() 
    { 
     LogHelper::HoldId($this->id); 
    } 

    /** 
    * @PostRemove 
    */ 
    public function onPostRemove() 
    { 
     LogHelper::SaveAction(LogHelper::ACTION_DELETE,LogHelper::ENTITY_USER,$this->id); 
    } 



    private function ApplyBehaviors() 
    { 
     $this->updated_at = new DateTime("now"); 
    } 

    ///////////////////////////////////////////////////////////////////////// 
    // Helpers                // 
    ///////////////////////////////////////////////////////////////////////// 

    public function syncronize($data) 
    { 
     $this->setType($data["type"]); 
     $this->setName($data["name"]); 
     $this->setUserName($data["user_name"]); 
     $this->setEmail($data["email"]); 
     $this->setPhone($data["phone"]); 
     $this->setCellPhone($data["cell_phone"]); 
     $this->setPermissions($data["permissions"]); 
     $this->setTimeTable($data["time_table"]); 
     $this->setDesktop($data["desktop"]); 
     $this->setBranchId($data["branch_id"]); 
     $this->setChatOn($data["chat_on"]); 
    } 

    public function toArray() 
    { 
     $data["id"] = $this->getId(); 
     $data["type"] = $this->getType(); 
     $data["name"] = $this->getName(); 
     $data["user_name"] = $this->getUserName(); 
     $data["phone"] = $this->getPhone(); 
     $data["cell_phone"] = $this->getCellPhone(); 
     $data["email"] = $this->getEmail(); 
     $data["password"] = $this->getPassword(); 
     $data["permissions"] = $this->getPermissions(); 
     $data["time_table"] = $this->getTimeTable(); 
     $data["desktop"] = $this->getDesktop(); 
     $data["branch_id"] = $this->getBranchId(); 
     $data["chat_on"] = $this->getChatOn(); 

     $data["created_at"] = $this->getCreatedAt(); 
     $data["updated_at"] = $this->getUpdatedAt(); 
     return $data; 
    } 

} 

爲什麼getDocComment能源部不能與上述工作類/實體只在服務器05上? 繼續....

+0

從Symfony中抽取一些代碼時,我遇到了自動加載實體的問題。嘗試直接從引導文件中包含實體文件,看看是否有幫助 –

回答

2

解決:

錯誤:

<?php 
/** @Entity 
* @HasLifecycleCallbacks 
* @Table(name="user") 
*/ 

namespace Entity; 
use Validation; 
use \DateTime; 
use \LogHelper; 

右:

<?php 
namespace Entity; 
use Validation; 
use \DateTime; 
use \LogHelper; 

/** @Entity 
* @HasLifecycleCallbacks 
* @Table(name="user") 
*/ 

但在PHP 5.3.8錯誤是正確的,只是發生在PHP 5.3.10上!