🎃

CakePHPで動的に適用するバリデーションのクラスを変更する

2023/03/29に公開

CakePHPはTableクラスにバリデーションを書く事が多いけど例えばクライアントから渡されるIDによって適用するバリデーションを適用したい場合にTableクラスに全て書いたらTableクラスが肥大化するのが気になりました。

行数が肥大化するのは本質的には問題では無いかもしれないけど基本的に一つのクラスの行数が肥大化するのは危ない信号だと思うのでバリデーションの責務を外に追い出したいと思いました。やり方は色々あると思うけど以下の方法で実装してみました。

class SampleAValidator extends Validator
{
    public function __construct()
    {
        parent::__construct();
        // バリデーションのルールを加える
    }
}
class MappingValidator
{
    /**
     * idと紐づくvalidatorClassを返却する
     * @param int $id
    */
    public static function getValidatorClass(int $id)
    {
        return match ($id) {
	    1 => new SampleAValidator()
	}
    }
}
//バリデーターを使用する側

class HogeTable(){

    public function dinamicValidate(int $id, array $data)
  {
      $validator = MappingValidator::getValidatorClass($id)
      return $validator->validate($data);
  }
}

感想

もっとフレームワークを利用したもっといい書き方あると思うけど、クラスを分けたら視認性もいいし保守もしやすいなーと思いました。

Discussion