×

在Slim3 中使用Mix Validate表单验证器

Falcon 2021-07-27 views:
摘要

正在生成中……

今天逛网站里发现有一个叫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字段是必填的,这也是我使用的图片上传字段,titlecontent是可选的。注意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());

 

本文收录于