在Slim3 中使用Mix Validate表單驗證器

今天逛網站裏發現有一個叫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());

 

本文在 CC BY-NC-SA 4.0 許可 下發布
  • 署名 - 您可以複製、發行、展覽、表演、放映、廣播或通過信息網絡傳播本作品,但必須 署名作者 並添加鏈接到 原文地址
  • 非商業性使用 — 您不得將本作品用於商業目的。
  • 相同方式共享 — 如果您再混合、轉換或者基於本作品進行創作,您必須基於與原先許可協議相同的許可協議 分發您貢獻的作品。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章