摘要
正在生成中……
今天逛网站里发现有一个叫mixphp的国人的PHP框架,我粗略看了一下,发现他有一个表单验证的组件,正好我最近要对上传图片进行验证,主要就是mime-type和文件大小之类校验,之前的脚手架用了一个叫alexgarrett/violin的验证器,我没有很深入使用,主要用起来很麻烦,而且没有针对上传文件的验证,而我又不想自己写,然后我就换mixphp的这个,而且之前用Violin的验证器写的功能也准备换掉。
基本用法可以看它的文档,基本覆盖了大部分的使用场景。不过国际化做得不够,默认的提示信息是中文的,但本地化做得还可以,比如它有中国手机号码的验证器,我使用主要是用在图片上传这一块,它也自带了文件和图片的验证器。
但是不要被它的示例误导,不能全照搬他的代码,比如它在控制器实例化时:
$form = new UserForm($request->getAttributes());
但 如里你在Slim3框架中这样写,会得不到验证的字段,这个传参要需要根据具体情况具体分析。比如在包含图片上传的表单情景下:
自定义一个校验器:
<?php
// ImageUploadForm.php
namespace App\Forms;
use Mix\Validate\Validator;
class ImageUploadForm extends Validator
{
public $image;
public $title;
public $content;
public function rules(): array
{
return [
'image'=>['image', 'mimes' => ['image/gif', 'image/jpeg', 'image/png'], 'maxSize' => 1024 * 5],
'title'=>['string','maxLength' => 100,'filter' => ['trim', 'strip_tags', 'htmlspecialchars']],
'content'=>['string','maxLength' => 255,'filter' => ['trim']],
];
}
public function scenarios(): array
{
return [
'create' => ['required' => ['image'], 'optional' => ['title', 'content']],
];
}
/**
* @return array
*/
public function messages(): array
{
return [
'image.required' => '上传字段错误',
'image.mimes' => '不允许的文件类型',
'image.maxSize' => '文件太大.',
'title.maxLength' => '标题太长',
'content.maxLength' => '内容太长',
];
}
}
这几个方法需要自己实现,其中image
字段是必填的,这也是我使用的图片上传字段,title
和content
是可选的。注意title
使用了filter
,也就是说除了校验字段外,还可以调用相应的函数来过滤,返回洁净化的字段值。在Controller
里这样获取这个值:
$form = new ImageUploadForm( $request->getParams(),$request->getUploadedFiles());
if (!$form->scenario('create')->validate()) {
// $form->error() 获取单条错误信息 ,$form->errors() 获取全部错误信息
return JsonRenderer::error($response,500,$form->error());
}
$title = $form->title;//获取洁净化的字段
注意实例化时是这样的:
$form = new ImageUploadForm( $request->getParams(),$request->getUploadedFiles());
第一个参数不能传入 $request->getAttributes()
, 因为这里取不到参数,要传$request->getParams()
表示请求中的查询参数,包含GET/POST。
第二个参数是一个 Psr\Http\Message\UploadedFileInterface
实例,是给上传文件字段校验的。
文档里还提到一个很方便的写法,直接把验证后的 $form
传入model
,比如
// 将表单对象直接传递到模型中保存数据
(new UserModel())->add($form);
但在Eloquent
不行,甚至 new UserModel($form)
都不行,但我觉得这样写还挺有用的。Eloquent
的参数需要一个数组或者实现了数组接口的对象
/**
* Create a new Eloquent model instance.
*
* @param array $attributes
* @return void
*/
public function __construct(array $attributes = [])
后面再研究看看。
注意:
如果是把请求字段json编码后放到Body里,比如payload是这样的:
那实例化里应该是这样的写:
$form = new UserForm($request->getParsedBody());