2015-12-11 75 views
0

我呼籲在這一個集體的智慧。我有以下非常奇怪的錯誤。Intermitent Naming Conflict

我有一個名爲File.php的模型。我在我的應用程序的幾個地方使用過它。但現在它似乎並沒有工作。

在這種情況下,它的作品在我的template.php:

 $this->Behaviors->load('Containable'); 

    $this->contain(
     array(
      'User', 
      'TemplatesUserType' => array(
        'UserType', 
        'FilesTemplatesUserType'=>array('File') 
      ) 
     ) 
    ); 
    $template=$this->find('first',array('conditions'=>array('Template.id'=>$template_id,"Template.user_id"=>$user['User']['id']))); 

這也適用於FilesTemplatesUserTypesController:

  $this->FilesTemplatesUserType->File->recursive=-1; 
      $file=$this->FilesTemplatesUserType->File->findByName($name); 

      if(gettype($file)=="array" && count($file)>0){ 
       $file_id=$file["File"]["id"]; 
      } 
      else{ 
       $this->FilesTemplatesUserType->File->create(); 
       $this->FilesTemplatesUserType->File->save(array("File"=>array("name"=>$name))); 
       $file_id=$this->FilesTemplatesUserType->File->getInsertID(); 
      } 

      $this->request->data["FilesTemplatesUserType"]["file_id"]=$file_id; 
     } 

     $this->FilesTemplatesUserType->create(); 
     $this->FilesTemplatesUserType->save($this->request->data); 

兩個案件工作,完全正常。但現在,從模型Document.php,失敗拋出一個500內部服務器錯誤:

$this->Behaviors->load("Containable"); 
    $this->contain(array(
      "UsersVersion"=>array(
        "conditions"=>array("UsersVersion.user_id !="=>$user["User"]["id"]), 
        "User" 
      ), 
      "Draft"=>array(
        "fields"=>array("Draft.id,Draft.template_id,Draft.name"), 
        "Template"=>array(
          "fields"=>array("Template.id, Template.name, Template.user_id"), 
          "TemplatesUserType"=>array(
            "DraftsUser"=>array(
             "User" 
            ), 
            "FilesTemplatesUserType"=>array("FilesUsersVersion","File") 
          ) 
        ) 
      ) 
     ) 
    ); 
    $draft=$this->findById($document_id); 

但是,直到我刪除的作品「文件」。在CORE/Utility/File.php

$model=$this->Draft->Template->TemplatesUserType->FilesTemplatesUserType->File; 
    $model->recursive=-1; 

    $file=$model->findByName("Ident"); 

它拋出在行88錯誤,指示$路徑有:

要調試,我想這在同一個文件array("class"=>"File","alias"=>"File")而不是string和以下錯誤消息:Fatal error: Call to undefined method File::findByName() in C:\Inetpub\vhosts\*******.com\httpsdocs\eolas\app\Controller\DocumentsController.php on line 245

使事情更混亂,這個工程從我的template.php型號:

$model=$this->TemplatesUserType->FilesTemplatesUserType->File; 
    $model->recursive=-1; 

    $file=$model->findByName("Ident"); 

它似乎以某種方式發生錯誤,具體取決於正在調用模型File的遞歸級別,並且可能與File.php Utility類發生衝突。

我的問題是:爲什麼它在某些地方完美地工作,直到現在失敗? CakePHP的內部工作是否有一些機會,我現在正在失去它?

我希望你能引導我走向正確的方向(而不必改變我的模型名稱,= P)。

非常感謝您提前!

回答

1

正如我的回答陳述your previous question不能有一個模型叫File因爲已經有一個在CakePHP的核心代號爲File類。您需要爲您的模型使用替代名稱。把File想象成保留字。

您的代碼有時候工作的原因歸結於您的模型或Cake的File實用程序是否先被觸摸。在你的代碼失敗的情況下,File被用作實用程序類而不是你的模型,因此不兼容。

想想看:如果蛋糕嘗試啓動類File的一個實例(new File(/* some params */)),這File類將它在你的代碼中使用?這個不清楚的事實應該給你提供線索,你不應該使用與工具類同名的模型。由於這一點,我懷疑你的錯誤日誌包含更多關於你的代碼的錯誤/警告。

不幸的是,你別無選擇,只能更改模型的名稱。但是,您可能可以更改某些重命名的模型類的屬性,使其仍然像File模型那樣工作(這是未經測試的,因爲我從來不需要這樣做,但可能值得一試)。例如,類(和文件名)重命名爲AppFile然後設置$name$alias$table特性,使模型表現爲File: -

<?php 
class AppFile extends AppModel { 

    public $name = 'File'; 

    public $alias = 'File'; 

    public $table = 'files'; 

} 
+1

您好!我懷疑File類名稱衝突,但是由於它直到現在一直在我的應用程序中完美運行,所以我完全迷惑爲什麼有時候會有不同的表現,讓我試圖找到解決方法。我嘗試了你的解決方案,並像魅力一樣工作!這提高了我對CakePHP內部工作的理解,併爲我節省了大約一個小時的重新調整工作。非常感謝!!! –

相關問題