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


Calling function from another controller bug

我有2个控制器:UsersController和AnalyticsController。

当我运行:

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

输出为:

Query: _loadChartFromId 

Warning (512): SQL Error: 1064:你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行使用"_loadChartFromId"附近的正确语法[CORE'cake'libs'model'datasources'dbo_source.php,第684行]

_loadChartFromId()函数以$chart_id作为参数并返回一个数组作为输出。我不知道为什么Query: _loadChartFromId出现

你不能从你的控制器调用其他控制器方法

在你的用户控制器中,$this->Analytic是Analytic模型的一个实例,而不是AnalyticsController。因此,CakePHP认为您正在尝试调用Analytic模型上的公共方法_loadChartFromId(),如您所知,该方法不存在。

你得到这个错误的原因是,如果你试图调用一个模型的不存在的方法,CakePHP试图将它转换为它的一个魔术查找类型。当然,它也不是一个有效的Magic Find Type,所以你会得到一个SQL错误。

<<p> 解决方案/strong>

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

你需要做两件事中的一件:

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

  2. 将方法移动到您的Analytic模型。你需要让它公开,这样控制器就可以访问它,在你的用户控制器中,你需要确保你已经加载了Analytic模型。

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

    然后你可以从你的用户控制器调用你之前做的方法。

我本可以选择关闭这个问题作为至少5个其他问题的精确副本(如果您搜索"cakephp另一个控制器")。但是答案很糟糕。它们实际上尝试调用新的Dispatchers或requestAction()。

那么如果你的问题是关于另一个控制器方法的:

简短的回答是:你不需要。

长篇大论的回答:你仍然不知道。这是初学者常犯的错误。如果主要是业务逻辑,则应该将功能放入组件中。然后可以从多个控制器访问该组件。

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

Also:从其他对象访问受保护的方法从来都不是一个好主意。如果你想从对象的"外部"使用它,请使用公共方法。

如果你的问题是关于模型方法:你需要在你的控制器中包含你的模型,然后才能使用它。无论是使用public $uses还是使用loadModel('ModelName')甚至ClassRegistry::init('ModelName')