配列パラメータで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(); } }