我的代码中的某些内容导致对TableRegistry::get()
的某些调用导致看起来像无限递归。
当我请求表作业时,它工作正常。对于表Currencies(和其他人),我收到此错误:
第92行/vendor/cakephp/cakephp/src/Core/functions.php中最大函数嵌套级别'256'的致命错误。
这是堆栈跟踪:
1. {main}() bin/cake.php:0
2. Cake\Console\CommandRunner->run() bin/cake.php:12
3. App\Shell\IngestionShell->initialize() vendor/cakephp/cakephp/src/Console/CommandRunner.php:140
4. Cake\ORM\TableRegistry::get() src/Shell/IngestionShell.php:32
5. Cake\ORM\Locator\TableLocator->get() vendor/cakephp/cakephp/src/ORM/TableRegistry.php:132
6. Cake\ORM\Locator\TableLocator->_create() cakephp/cakephp/src/ORM/Locator/TableLocator.php:216
7. Cake\ORM\Table->__construct() vendor/cakephp/cakephp/src/ORM/Locator/TableLocator.php:249
8. App\Model\Table\CurrenciesTable->initialize() vendor/cakephp/cakephp/src/ORM/Table.php:291
9. Cake\ORM\TableRegistry::get() src/Model/Table/CurrenciesTable.php:14
10. Cake\ORM\Locator\TableLocator->get() vendor/cakephp/cakephp/src/ORM/TableRegistry.php:132
11. Cake\ORM\Locator\TableLocator->_create() vendor/cakephp/cakephp/src/ORM/Locator/TableLocator.php:216
Cake\ORM\Table->__construct() vendor/cakephp/cakephp/src/ORM/Locator/TableLocator.php:249
13. App\Model\Table\CurrenciesTable->initialize() vendor/cakephp/cakephp/src/ORM/Table.php:291
...
之后它会无休止地重复,直到致命的错误。
在真正发生任何事情之前,我在initialize()
中调用它:
class IngestionShell extends Shell
{
private $currencies;
private $jobs;
public function initialize()
{
parent::initialize();
// This works:
$this->jobs = TableRegistry::get('Jobs');
// This crashes:
$this->currencies = TableRegistry::get('Currencies');
}
...
}
同样当我在控制器中运行$this->loadModel('Currencies');
时,我的内存不足,这次是在第597行的vendor/cakephp/cakephp/src/Utility/Inflector.php
。
class PagesController extends AppController
{
public function home() {
$this->loadModel('Currencies');
}
...
}
我明确设置的模型之间没有任何关系 - 例如hasMany()
- 表结构非常简单。以下是两个相关的表格:
CREATE TABLE currencies (
id int(11) NOT NULL,
symbol varchar(10) NOT NULL,
name varchar(50) NOT NULL,
is_primary tinyint(1) NOT NULL,
is_deleted tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE jobs (
id int(11) NOT NULL,
job_name varchar(50) NOT NULL,
job_time int(10) UNSIGNED NOT NULL,
options json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE currencies
ADD PRIMARY KEY (id),
ADD UNIQUE KEY symbol (symbol),
ADD KEY is_primary (is_primary);
ALTER TABLE jobs
ADD PRIMARY KEY (id);
ALTER TABLE currencies
MODIFY id int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE jobs
MODIFY id int(11) NOT NULL AUTO_INCREMENT;
编辑:包括CurrenciesTable类。 TableRegistry
中对initialize()
的调用会导致递归吗?
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
class CurrenciesTable extends Table
{
public $currencies;
public function initialize(array $config)
{
parent::initialize($config);
$this->currencies = TableRegistry::get('Currencies');
}
...
}
答案 0 :(得分:0)
模型TableRegistry::get()
函数中对initalize()
的调用导致了递归。事实证明,这一呼吁的原因可能是对模型如何运作的误解,正如npm在他的评论中指出的那样,不应该在那里。