CakePHP 3.5.5:可以加载模型导致无限递归吗?

时间:2017-11-09 01:49:34

标签: php cakephp cakephp-3.x

我的代码中的某些内容导致对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');
    }
    ...
}

1 个答案:

答案 0 :(得分:0)

模型TableRegistry::get()函数中对initalize()的调用导致了递归。事实证明,这一呼吁的原因可能是对模型如何运作的误解,正如npm在他的评论中指出的那样,不应该在那里。