2017-11-09 20 views
0

私のコードの中には、無限の再帰のように見えるものがあるために、TableRegistry::get()への特定の呼び出しが発生しています。CakePHP 3.5.5:モデルをロードすると無限再帰を引き起こすことができますか?

私はテーブルジョブを要求するとき、それはうまく動作します。テーブル通貨(およびその他)のために私はこのエラーを取得する:

Fatal error of Maximum function nesting level of '256' in /vendor/cakephp/cakephp/src/Core/functions.php on line 92.

は、ここでスタックトレースです:

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');を実行して、ライン上でvendor/cakephp/cakephp/src/Utility/Inflector.phpで、この時間597

class PagesController extends AppController 
{ 
    public function home() { 
     $this->loadModel('Currencies'); 
    } 
... 
} 

明示的に設定されたモデル間の関係はありません。 hasMany() - テーブル構造は非常にシンプルです。次の2つの関連するテーブルがあります。

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; 

EDIT:CurrenciesTableクラスを含むEDIT: 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

1回の再帰を含むstacktraceの詳細を表示してください。そして、問題はおそらく 'CurrenciesTable'クラスに置かれ/トリガーされているようですので、そのクラスのコードも表示してください。また、常にあなたの_exact_ CakePHPのバージョン( 'vendor/cakephp/cakephp/VERSION.txt'の最後の行)をお伝えください - ありがとう! – ndm

+0

@ndm - ポインタをありがとう、私は今この情報を追加しました。私は初期化でTableRegistryへの呼び出しがそれと何か関係がなければならないと考えています。私はこれが2つの呼び出しをもたらすだけだと思ったが、なぜこれが再帰をもたらすのだろうか? – Simon

+0

それは確かに問題の原因です、はい。 'Table :: initialize()'がコンストラクタ時に呼び出され、複数のインスタンス化を防ぐテーブルロケータのチェックは、最初のインスタンスが完全に構築された後にのみ有効です。つまり、最初にこの電話をかける理由はありません。 – ndm

答えて

0

は、モデルのinitalize()機能でTableRegistry::get()への呼び出しは、再帰を引き起こしていました。この呼び出しの理由は、おそらくモデルがどのように動作しているのかという誤解であり、npmがコメントで指摘したように、そこにいる必要はないはずです。

関連する問題