配列パラメータでslim3のValidatorを使いたい

slim3はパラメータ名のサフィックスにArrayを付けたら配列パラメータとして処理してくれるのはいいんだけど、Validatorは配列として処理してくれない。

で、配列でValidatorを使うためのバリデータのラッパーを作ってみた。

public class ArrayValidator implements Validator {

    private Validator[] validators;

    public ArrayValidator(Validator... validators) {
        this.validators = validators;
    }

    public String validate(Map<String, Object> parameters, String name) {
        Object[] values = (Object[]) parameters.get(name);
        if (values == null) {
            for (Validator validator : validators) {
                String msg = validator.validate(parameters, name);
                if (msg != null) {
                    return msg;
                }
            }
            return null;
        }

        for (Validator validator : validators) {
            for (Object value : values) {
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put(name, value);
                String msg = validator.validate(map, name);
                if (msg != null) {
                    return msg;
                }
            }
        }
        return null;
    }

}

使い方

public class InsertController extends Controller {

    private BlogService service = new BlogService();

    private BlogMeta meta = BlogMeta.get();

    @Override
    public Navigation run() throws Exception {
        if (!validate()) {
            return forward("create");
        }
        Blog blog = new Blog();
        BeanUtil.copy(request, blog);
        service.insert(blog);
        return redirect(basePath);
    }

    protected boolean validate() {
        Validators v = new Validators(request);
        v.add(meta.title, v.required());
        v.add(meta.content, v.required());

        //↓これ
        v.add("dateArray", 
            new ArrayValidator(
                v.required(), 
                v.dateType("yyyy/MM/dd")));
        return v.validate();
    }
}