间歇性命名冲突
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);
但直到我删除 "File" 才有效。
为了调试,我在同一个文件中尝试了这个:
$model=$this->Draft->Template->TemplatesUserType->FilesTemplatesUserType->File;
$model->recursive=-1;
$file=$model->findByName("Ident");
它在 CORE/Utility/File.php
中的第 88 行抛出错误,表明 $path 具有: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.php 实用程序 class.[=19= 发生冲突时]
我的问题是:为什么它在某些地方工作得很好,直到现在才失败? CakePHP 的内部运作是否有什么我偶然正确地击中但现在我失去了它?
我希望你能引导我朝着正确的方向前进(并且不必更改我的型号名称,=P)。
非常感谢您!
如我对 的回答所述,您 不能 有一个名为 File
的模型,因为已经有一个 class 名为 File
在 CakePHP 的核心代码中。您需要为您的模型使用一个替代名称。将 File
视为保留字。
您的代码有时能正常工作的原因归结为您的模型或 Cake 的 File
实用程序是否先被触及。如果您的代码失败,File
被用作实用程序 class 而不是您的模型,因此不兼容。
想一想:如果 Cake 尝试启动 class File
(即 new File(/* some params */)
)的实例,File
class 它会在您的代码中使用吗?这个不清楚的事实应该给您提示,您不应该使用与实用程序 class 同名的模型。我怀疑您的错误日志因此包含更多关于您的代码的 errors/warnings。
很遗憾,您别无选择,只能更改模型的名称。但是,您可以更改一些重命名的模型 class' 属性,以便它仍然像 File
模型一样运行(这是未经测试的,因为我从来不需要这样做,但可能是值得一试)。例如,将 class(和文件名)重命名为 AppFile
,然后设置 $name
、$alias
和 $table
属性,以便模型表现为 File
:-
<?php
class AppFile extends AppModel {
public $name = 'File';
public $alias = 'File';
public $table = 'files';
}
我呼吁集体智慧解决这个问题。我有以下非常奇怪的错误。
我有一个名为 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);
但直到我删除 "File" 才有效。
为了调试,我在同一个文件中尝试了这个:
$model=$this->Draft->Template->TemplatesUserType->FilesTemplatesUserType->File;
$model->recursive=-1;
$file=$model->findByName("Ident");
它在 CORE/Utility/File.php
中的第 88 行抛出错误,表明 $path 具有: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.php 实用程序 class.[=19= 发生冲突时]
我的问题是:为什么它在某些地方工作得很好,直到现在才失败? CakePHP 的内部运作是否有什么我偶然正确地击中但现在我失去了它?
我希望你能引导我朝着正确的方向前进(并且不必更改我的型号名称,=P)。
非常感谢您!
如我对 File
的模型,因为已经有一个 class 名为 File
在 CakePHP 的核心代码中。您需要为您的模型使用一个替代名称。将 File
视为保留字。
您的代码有时能正常工作的原因归结为您的模型或 Cake 的 File
实用程序是否先被触及。如果您的代码失败,File
被用作实用程序 class 而不是您的模型,因此不兼容。
想一想:如果 Cake 尝试启动 class File
(即 new File(/* some params */)
)的实例,File
class 它会在您的代码中使用吗?这个不清楚的事实应该给您提示,您不应该使用与实用程序 class 同名的模型。我怀疑您的错误日志因此包含更多关于您的代码的 errors/warnings。
很遗憾,您别无选择,只能更改模型的名称。但是,您可以更改一些重命名的模型 class' 属性,以便它仍然像 File
模型一样运行(这是未经测试的,因为我从来不需要这样做,但可能是值得一试)。例如,将 class(和文件名)重命名为 AppFile
,然后设置 $name
、$alias
和 $table
属性,以便模型表现为 File
:-
<?php
class AppFile extends AppModel {
public $name = 'File';
public $alias = 'File';
public $table = 'files';
}