从另一个控制器bug调用函数

时间:2013-01-04 05:39:04

标签: php cakephp

我有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出现的原因。

2 个答案:

答案 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的概念。

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

  1. _loadChartFromId()移至您的用户控制器。在我看来,这似乎是违反直觉的,因为它可能与用户无关。

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

    class Analytic extends AppModel {
    
        public function _loadChartFromId($chart_id) {
           // ...
        }
    }
    

    然后,您可以从用户控制器中调用此方法。