2016-08-23 22 views
0

私はLaravel Eloquent Modelにコンストラクタを持っています。モデルをインスタンス化すると、コンストラクタが呼び出すメソッドが別のメソッドを呼び出すときに無限ループが発生します。 putPieces function$this->putPieceOnBoardを呼び出した後PHPのコンストラクタは、メソッド内でメソッドを呼び出すときに無限ループを生成します

class ChessboardCell extends Model 
{ 
    //... 

    public function __construct() 
    { 
     parent::__construct(); 

     //... 

     $this->putPieces('pawn', 'black', $blackPawns); 

     //... 
    } 

    private function putPieces($piece, $player, $piecesArray) 
    { 
     //... 

     if ($piece == 'pawn') { 
      for ($file = 'a'; $file <= 'h'; $file++) { 
       $pawnPiece = array_shift($piecesArray); 
       $this->putPieceOnBoard($file, $rank, $pawnPiece); 
      } 
     } 

     //... 
    } 

    public function putPieceOnBoard($file, $rank, $piece) 
    { 
     $chessboardCell = ChessboardCell::where('file', $file) 
      ->where('rank', $rank) 
      ->first(); 

     if (is_null($chessboardCell)) { 
      // Gera excessão: não pegou a célula 
     } 
     $chessboardCell->current_piece = $piece->id; 

     $chessboardCell->save(); 
    } 

} 

は無限ループを取得します。

ここではどうなりますか?

$chessboardCell = ChessboardCell::where('file', $file) 
     ->where('rank', $rank) 
     ->first(); 

が次にあなたがそうでputPieces()とによって呼び出されputPieceOnBoard()によって呼び出され__constructor()__constructor()からputPieces()を呼び出していることに気づく:すべての通知の

答えて

2

まず、コードのこの部分は、あなたのコンストラクタ呼び出していること等々。

この場合、ソリューションは単一責任(here)の聖なる原則であるため、コンストラクタからputPieces()を削除し、代わりにそれを呼び出します。

ソフトウェア設計の原則についての詳細はあなたが$blackPawns変数を使用するコンストラクタでthis

0

を確認してください。しかし、それはどこから来たのですか? たぶん、あなたはこの

public function __construct($blackPawns) 
{ 
    parent::__construct(); 

    //... 

    $this->putPieces('pawn', 'black', $blackPawns); 

    //... 
} 
+0

'$ blackPawnsようなコード変更する必要は' putPieces'コールの上に宣言されたオブジェクトの配列を指します。 – Caco

+0

$ blackPawns配列を宣言した場所と方法を表示できますか? –

+0

実際、 '$ blackPawns'は、いくつかのオブジェクトを取得するために他のEloquentモデルメソッドを呼び出す関数によって返された配列を受け取る変数です。私は自分自身を不明確に表現した。 @Ahmadの答えがこの問題を明確にしたので、より多くのコード行を含めるように質問を更新する必要はないと思います。 – Caco

関連する問題