2016-06-22 6 views
2

基本的には、いくつかの異なるモデルを使用するファクトリクラスを実装したいと考えています。私はyii2の中でこれをやっていかなければならないのかという手がかりはない。どんな助けもいいだろう。工場クラスを作成するためのyii2のベストプラクティスは何ですか?

ここに私がしようとしていることの一般的な考えがあります。 app \ models \ Eventを使用します。 app \ models \ EventParticipantを使用します。 app \ models \ Matchを使用します。

/** 
* @property Event $Event 
* @property EventParticipant $EventParticipant 
* @property Match $Match 
*/ 
abstract class Tournament 
{ 
    protected $_id; 
    protected $_event; 
    protected $_type; 

    final public function __construct($event) { 
     $this->Event = new Event(); 
     $this->EventParticipant = new EventParticipant(); 
     $this->Match = new Match(); 

     if(!$event) { 
      throw new \yii\web\HttpException(400, 'Invalid Event', 405); 
     } 

     $this->_id = $event['Event']['id']; 
    } 
} 

}

答えて

1

私は、コントローラにそれらを使用する、モデル内のHTTP例外をスロー避けるだろう。あなたは$ eventを持つ必要があるので、例えばInvalidConfigurationExceptionを投げることができます。

は、工場のデザインパターンの多くの実装があり、ここでは最も簡単な

class TournamentFactory 
{ 
    public static function create(Event $event, EventParticipant $eventParticipant, Match $match) { 
     return new Tournament($event, $eventParticipant, $match); 
    } 
} 

ですが、私はそれがこの例で使用するのですが表示されません。私は主にあなたの例では、オブジェクト型、このような何かを切り替えるためにそれを使用する:

$grandSlam = TournamentFacory::create('grandSlam'); 
$grandSlam->setEvent($event); 
$grandSlam->setParticipants($participants); 
... 
$masters = TournamentFacory::create('masters'); 
... 

これらのオブジェクトは共通で同じプロパティが、異なる実装があるかもしれません。例えば、マスターは2つの勝利セット、3のグランドスラム、...など。

+0

工場の理由もよく作っていますので、シングルエリミネーション、ダブルエリミネーション、ラウンドロビン、スイスなど – user1620152

関連する問題