我使用的是CakePHP3.0.5,我只是从模型中调用自定义函数。但它显示未知方法错误。我如何从控制器中调用自定义函数?
// Controller
class TopController extends AppController {
public function initialize() {
parent::initialize();
$this->loadModel('TopRawSql');
}
public function showTop(){
$data = TableRegistry::get('TopRawSql');
$data->getTest(); // Unknown method error occur
}
}
// Model
class TopRawSql extends Table {
public function getTest() {
return 'OK';
}
}
我跟踪了错误消息,发现了下面的代码。这是否意味着,我不能使用没有“find”前缀的自定义函数名?
// vendor->cakephp->src->ORM->Table.php
public function __call($method, $args)
{
if ($this->_behaviors && $this->_behaviors->hasMethod($method)) {
return $this->_behaviors->call($method, $args);
}
if (preg_match('/^find(?:\w+)?By/', $method) > 0) {
return $this->_dynamicFinder($method, $args);
}
throw new \BadMethodCallException(
sprintf('Unknown method "%s"', $method)
);
}
2条答案
按热度按时间iq0todco1#
您的表类名称错误,所有表类必须以
Table
结尾,即TopRawSqlTable
。如果类名不对,我认为文件名也可能是错的。我不知道你是否在文件中设置了正确的命名空间,或者根本没有命名空间,因为它没有在你的问题中显示出来,但这也需要遵守相应的约定,通常是
App\Model\Table
。如果找不到所请求别名的类,则将使用
\Cake\ORM\Table
的泛型示例,这当然会导致失败,因为它没有任何自定义代码。另请参阅
*Cookbook〉CakePHP概览〉CakePHP惯例〉模型惯例
*Cookbook〉配置〉禁用通用表
llmtgqce2#
回答你的问题,是的。call()魔术函数将要求模型体中的每个函数要么是get* 要么是set* 函数。但是你引用的代码直接指向你要寻找的答案:创建一个Behavior并根据需要调用该函数。