Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从另一个控制器错误调用函数_Php_Cakephp - Fatal编程技术网

Php 从另一个控制器错误调用函数

Php 从另一个控制器错误调用函数,php,cakephp,Php,Cakephp,我有两个控制器:UsersController和AnalyticsController 当我跑步时: //UsersController: function dummyFunction(){ $this->Analytic->_loadChartFromId($chart_id); } 输出为: Query: _loadChartFromId 警告(512):SQL错误:1064:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行[CORE\cak

我有两个控制器:UsersController和AnalyticsController

当我跑步时:

//UsersController:
function dummyFunction(){
    $this->Analytic->_loadChartFromId($chart_id);
}
输出为:

Query: _loadChartFromId 
警告(512):SQL错误:1064:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行[CORE\cake\libs\model\datasources\dbo\u source.php,第684行]中“\u loadChartFromId”附近使用的正确语法


\u loadChartFromId()
函数将$chart\u id作为参数,并返回一个数组作为输出。我不知道为什么会出现
Query:\u loadChartFromId

我可以选择将此问题作为至少5个其他问题的精确副本来结束(如果您搜索“cakephp另一个控制器”)。 但答案很糟糕。它们实际上试图调用新的Dispatchers或requestAction()

因此如果你的问题是关于另一种控制器方法:

简单的回答是:你没有

答案很长:你还是不知道。这是一个典型的初学者错误。 如果主要是业务逻辑,那么应该将功能放入组件中。然后可以从多个控制器访问该组件

如果它更像模型数据(如您的示例中所示),则将功能放入模型层(在适当的模型中)。这样,您也可以从应用程序中的任何位置访问它

另外:从其他对象访问受保护的方法从来都不是一个好主意。如果要从对象的“外部”使用公共方法,请使用公共方法

如果您的问题是关于模型方法: 在使用控制器之前,需要将模型包括在控制器中。
通过使用
public$uses
或使用
loadModel('ModelName')
甚至
ClassRegistry::init('ModelName')
您不会从控制器调用其他控制器方法

在用户控制器中,
$this->analysis
是分析模型的实例,而不是AnalyticsController。因此CakePHP认为您试图在分析模型上调用一个名为
\u loadChartFromId()
的公共方法,正如您所知,该方法并不存在

出现错误的原因是,如果试图调用一个不存在的模型方法,CakePHP会尝试将其转换为它的一个方法。当然,它也不是有效的Magic Find类型,因此会出现SQL错误

解决方案

很难提供一个完整的解决方案,因为我们只有您的部分代码,但您编写应用程序的方式可能违反了MVC的概念

您需要做以下两件事之一:

  • 将loadChartFromId()移动到用户控制器。在我看来,这似乎是违反直觉的,因为它可能与用户无关

  • 将方法移动到分析模型。您需要将其公开,以便控制器可以访问它,并且在用户控制器中,您需要确保已加载分析模型

    class Analytic extends AppModel {
    
        public function _loadChartFromId($chart_id) {
           // ...
        }
    }
    
    然后,您可以像以前一样从用户控制器调用该方法


  • \u loadChartFromId()
    方法定义在哪里?@Nick AnalyticsController我想。