我有2个控制器:UsersController和AnalyticsController。
当我跑步时:
//UsersController:
function dummyFunction(){
$this->Analytic->_loadChartFromId($chart_id);
}
输出是:
Query: _loadChartFromId
警告(512):SQL错误:1064:您的SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“_loadChartFromId”附近使用正确的语法[CORE \ cake \ libs \ model \ datasources \ dbo_source.php,第684行]
_loadChartFromId()
函数将$ chart_id作为参数,并返回一个数组作为输出。我不知道Query: _loadChartFromId
出现的原因。
答案 0 :(得分:0)
我本可以选择将这个问题作为至少5个其他问题的完全重复(如果你搜索“cakephp另一个控制器”)。 但那里的答案很可怕。他们实际上尝试调用新的Dispatchers或requestAction()。
所以如果你的问题是关于另一个控制器方法:
简短的回答是:你没有。
答案很长:你还没有。这是一个典型的初学者错误。 如果主要是业务逻辑,则应将功能放入组件中。然后可以从多个控制器访问该组件。
如果它更像模型数据(如您的示例中所示),请将功能放入模型层(在适当的模型中)。这样,您也可以从应用程序的任何位置访问它。
另外:从其他对象访问受保护的方法绝不是一个好主意。如果您打算从对象“外部”使用它,请使用公共方法。
如果您的问题是关于模型方法:
您需要先将模型包含在控制器中,然后才能使用它。
使用public $uses
或使用loadModel('ModelName')
甚至ClassRegistry::init('ModelName')
。
答案 1 :(得分:0)
您不会从控制器调用其他控制器方法。
在用户控制器中,$this->Analytic
是Analytic模型的实例,而不是AnalyticsController。所以CakePHP认为你试图在Analytic模型上调用一个名为_loadChartFromId()
的公共方法,如你所知,它不存在。
您收到错误的原因是因为如果您尝试调用模型的不存在方法,CakePHP会尝试将其转换为其Magic Find Types之一。当然,它也不是有效的Magic Find Type,因此您会收到SQL错误。
<强>解决方案强>
由于我们只有部分代码,因此很难提供完整的解决方案,但您可能会以编写应用程序的方式违反MVC的概念。
您需要做以下两件事之一:
将_loadChartFromId()
移至您的用户控制器。在我看来,这似乎是违反直觉的,因为它可能与用户无关。
将方法移至Analytic模型。您需要将其公开以便控制器可以访问它,并且在您的用户控制器中,您需要确保已加载分析模型。
class Analytic extends AppModel {
public function _loadChartFromId($chart_id) {
// ...
}
}
然后,您可以从用户控制器中调用此方法。