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
}
ウェルに合理的な解決策だと思う、 'アプリケーションは:: make'が醜いならば、Laravelはおそらくではありません最良の選択。コンテナを使用するのはかなり慣用的な方法であり、フレームワークはそれに大きく依存しています。デフォルトでは 'bind'は非共有サービスを登録します。つまり、コンテナから新しいインスタンスを取得します。 –
'App :: make'が醜いだけではありません。 IMO - クローンを使用することで、エラーの可能性が減ります。例えば'App:make'を忘れるか' new'を忘れると将来の反復でバグが発生するでしょう。例えば'errors'配列と、それ以降の呼び出しで残ったアーチファクトを、コード内の他の場所にも埋めることで実現します。 – Gravy
私は 'App :: make'を*忘れる*ことが' clone'を忘れる*よりも悪いことを理解していますが、あなたの場合は本当に味の問題です。一般に、クローンはわずかに異なります。なぜなら、クローンは、注入されたオブジェクトの同じインスタンスを共有するからです。クローンは、望ましい動作である場合としない場合があります。 –