Php 从另一个控制器错误调用函数
我有两个控制器:UsersController和AnalyticsController 当我跑步时: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:
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的概念
您需要做以下两件事之一:
class Analytic extends AppModel {
public function _loadChartFromId($chart_id) {
// ...
}
}
然后,您可以像以前一样从用户控制器调用该方法\u loadChartFromId()
方法定义在哪里?@Nick AnalyticsController我想。