2017-02-24 4 views
0

カスタムバリデーターを作成したいと思います。しかし、毎回newに電話することは望ましくありません。テストするのが難しくなります。私はまたApp::makeが醜いタッドであると思う。私はちょうど依存性注入したい私のカスタムバリデータを使用してください。クローンを使用したPHP疑似不変オブジェクト

これを達成する方法についての私の考えは、cloneを使用することです。 validateメソッドを呼び出すと、$ thisではなくcloneのプロパティが設定されます。そのようにして、クラスのDIバージョンは元のままです。また、この方法でテスト/モックするのも非常に簡単です。

これは適切なパターンですか/ちょうどnewを使用する必要がありますか?

マイカスタムバリデータ

class CustomValidator 
{ 
    protected $rules = [ 
     'key' => 'required', 
    ]; 

    protected $errors = []; 

    public function validate(array $event): CustomValidator 
    { 
     $v = Validator::make($event, $this->rules); 

     if ($v->fails()) { 
      $copy = clone $this; 
      $copy->errors = $v->errors()->toArray(); 

      return $copy; 
     } 

     return $this; 
    } 

    public function hasErrors(): bool 
    { 
     return !empty($this->errors); 
    } 

    public function getErrors(): array 
    { 
     return $this->errors; 
    } 
} 

使用法:

foreach ($events as $event) { 
    // customValidator is immutable. $v is cloned 
    $v = $this->customValidator->validate($event); 

    if ($v->hasErrors()) { 
     // do something with $v->errors(); 
     continue; 
    } 

    // No errors... Do something else 
} 
+0

ウェルに合理的な解決策だと思う、 'アプリケーションは:: make'が醜いならば、Laravelはおそらくではありません最良の選択。コンテナを使用するのはかなり慣用的な方法であり、フレームワークはそれに大きく依存しています。デフォルトでは 'bind'は非共有サービスを登録します。つまり、コンテナから新しいインスタンスを取得します。 –

+0

'App :: make'が醜いだけではありません。 IMO - クローンを使用することで、エラーの可能性が減ります。例えば'App:make'を忘れるか' new'を忘れると将来の反復でバグが発生するでしょう。例えば'errors'配列と、それ以降の呼び出しで残ったアーチファクトを、コード内の他の場所にも埋めることで実現します。 – Gravy

+0

私は 'App :: make'を*忘れる*ことが' clone'を忘れる*よりも悪いことを理解していますが、あなたの場合は本当に味の問題です。一般に、クローンはわずかに異なります。なぜなら、クローンは、注入されたオブジェクトの同じインスタンスを共有するからです。クローンは、望ましい動作である場合としない場合があります。 –

答えて

0

cloneは完全に有効であり、多くの場合、流暢syntaxedのAPIでオブジェクトの不変性のために使用されています。だから私はそこに問題を見ない。

私はあなたがが半不変性に関するいくつかのコメントを取得します疑うが、私は個人的にそれはあなたの問題

関連する問題