【问题标题】:Intermitent Naming Conflict间歇性命名冲突
【发布时间】:2015-12-11 00:10:32
【问题描述】:

我呼吁在这个问题上集体智慧。我遇到了以下非常奇怪的错误。

我有一个名为 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);

但直到我删除有效的“文件”。

为了调试,我在同一个文件中尝试了这个:

$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 实用程序类发生冲突。

我的问题是:为什么它在某些地方运行良好,而到现在却失败了? CakePHP 的内部工作原理是否有一些我偶然正确击中的东西,现在我失去了它?

我希望你能引导我朝着正确的方向前进(并且不必更改我的模型名称,=P)。

非常感谢您!

【问题讨论】:

    标签: file cakephp conflict naming


    【解决方案1】:

    正如我对your previous question 的回答中所述,您不能拥有一个名为File 的模型,因为在CakePHP 的核心代码中已经有一个名为File 的类。您需要为模型使用替代名称。将File 视为保留字。

    您的代码有时可以正常工作的原因归结为您的模型或 Cake 的 File 实用程序是否首先被触及。如果您的代码失败,File 被用作实用程序类而不是您的模型,因此不兼容。

    想一想:如果 Cake 尝试启动 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';
    
    }
    

    【讨论】:

    • 您好!我怀疑 File 类名冲突,但由于它在我的应用程序中一直运行良好,直到现在,我完全不明白为什么有时会出现不同的行为,是什么让我试图找到解决方法。我尝试了您的解决方案,并像魅力一样工作!这提高了我对 CakePHP 内部工作原理的理解,并为我节省了大约一个小时的重新调整时间。非常感谢!!!
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 2013-01-26
    • 2010-11-15
    • 2012-12-18
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多