# 自定義驗證規則
### [](https://octobercms.com/docs/services/validation#custom-validation-rules)自定義驗證規則
#### 注冊自定義驗證規則
有多種有用的驗證規則;但是,您可能希望自己指定一些。
建議添加自己的驗證規則的方法是通過`extend`方法擴展Validator實例。在October CMS插件中,可以將其添加到注冊文件中的`boot()`回調方法中`Plugin.php`。
您可以使用自定義驗證規則將Validator實例擴展為`Closure`或`Rule`對象。
#### 使用閉包
如果只需要在整個插件或應用程序中指定一次的自定義規則的功能,則可以使用Closure定義規則。第一個參數定義規則的名稱,第二個參數提供閉包。
~~~
use Validator;
public function boot()
{
Validator::extend('foo', function($attribute, $value, $parameters) {
return $value == 'foo';
});
}
~~~
定制驗證程序Closure接收三個參數:`$attribute`被驗證的名稱,`$value`屬性的和`$parameters`傳遞給規則的數組。
您也可以將類和方法傳遞給`extend`方法,而不是傳遞給Closure:
~~~
Validator::extend('foo', 'FooValidator@validate');
~~~
使用您的自定義規則擴展驗證器后,您需要將其添加到規則定義中。例如,您可以將其添加到`$rules`模型的數組中。
~~~
public $rules = [
'field' => 'foo'
];
~~~
#### 使用規則對象
一個`Rule`對象表示您的模型實現了一個可重復使用的驗證規則`Illuminate\Contracts\Validation\Rule`的合同。每個規則對象必須提供三種方法:`passes`確定給定值是否通過驗證的`validate`方法,在驗證時調用的`message`方法以及定義默認后備錯誤消息的方法。
~~~
<?php
use Illuminate\Contracts\Validation\Rule;
class Uppercase implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return strtoupper($value) === $value;
}
/**
* Validation callback method.
*
* @param string $attribute
* @param mixed $value
* @param array $params
* @return bool
*/
public function validate($attribute, $value, $params)
{
return $this->passes($attribute, $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be uppercase.';
}
}
~~~
要使用您的規則對象擴展Validator,您可以將類的實例提供給Validator`extend`方法:
~~~
Validator::extend('uppercase', Uppercase::class);
~~~
`Rule`對象應存儲在插件目錄內的**/ rules**子目錄中。
#### 定義錯誤信息
您還需要為自定義規則定義錯誤消息。您可以使用嵌入式自定義消息數組,也可以通過在驗證語言文件中添加條目來實現。此消息應放置在數組的第一級。
~~~
"foo" => "Your input was invalid!",
"accepted" => "The :attribute must be accepted.",
~~~
對于`Rule`對象,您可以通過提供`message`返回字符串的方法來設置后備錯誤消息。
創建自定義驗證規則時,有時可能需要為錯誤消息定義自定義占位符替換。您可以通過`replacer`在Validator外觀上調用該方法來實現。您也可以在`boot`插件的方法中執行此操作。
~~~
public function boot()
{
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
// return a message as a string
});
}
~~~
回調接收4個參數:`$message`是驗證者返回的消息,是驗證`$attribute`失敗的屬性,`$rule`是規則對象以及`$parameters`是使用驗證規則定義的參數。例如,您可以將列名插入到參數中定義的消息中:
~~~
public function boot()
{
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
return str_replace(':column', $parameters[0], $message);
});
}
~~~
如果希望通過錯誤消息支持多種語言,則需要`translator.beforeResolve`在插件中監聽事件,因為`boot`在完全啟用翻譯支持之前,可以運行插件的方法。
~~~
public function boot()
{
Event::listen('translator.beforeResolve', function ($key, $replaces, $locale) {
if ($key === 'validation.uppercase') {
return Lang::get('plugin.name::lang.validation.uppercase');
}
});
}
~~~
#### 注冊自定義驗證程序解析器
如果希望為應用程序提供大量自定義規則,則還可以定義驗證程序解析器。請注意,每個Validation實例只能定義一個解析器,因此不建議在插件中定義解析器,除非您使用自己的Validation實例而不是全局Validator外觀。
要定義解析器,您可以`resolver`在Validator外觀中為該方法提供一個Closure。
~~~
Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes) {
return new CustomValidator($translator, $data, $rules, $messages, $customAttributes);
});
~~~
解析器支持的每個規則都是使用`validateXXX`方法定義的。例如,`foo`驗證規則將尋找稱為的方法`validateFoo`。該`validate`方法應返回一個布爾值,關于給定是否`$value`通過驗證。
~~~
public function validateFoo($attribute, $value, $parameters)
{
// return whether the value passes validation
}
~~~
與Validator`replacer`方法一樣,有時可能需要為錯誤消息定義自定義占位符替換。您可以通過定義`replaceXXX`方法在解析器中執行此操作。
~~~
protected function replaceFoo($message, $attribute, $rule, $parameters)
{
return str_replace(':foo', $parameters[0], $message);
}
~~~
- 基本說明
- 基本操作
- October cms 安裝
- 后臺控制器路徑
- 圖標
- 獲取安裝網上的插件/主題
- 插件構造器使用
- 定時任務
- October后臺控制器
- vscode編輯器
- ajax操作
- 使用
- ajax更新組件
- ajax屬性API
- JavaScript API
- ajax綜合使用
- 主題
- 多語言主題
- 安裝市場主題
- 主題程序處理
- 主題
- 頁面
- 部件
- 布局
- 內容
- 組件
- 媒體
- 主題表單操作
- 表單使用
- 表單后端程序處理
- 插件
- 自定義插件
- 插件說明
- 插件導航條
- 插件數據庫設置
- 插件的設置管理
- 插件的配置文件config
- 組件
- app服務
- app容器
- 擴展行為
- 緩存
- Collection類
- Lazy Collections
- Collection方法
- 助手函數
- 數組助手函數
- 路徑助手函數
- 玄樂助手函數
- 其他助手函數
- 錯誤與記錄
- 事件處理
- HTML頁面
- 文件與目錄操作
- 散列和加密
- 郵件
- 郵件內容
- 郵件發送
- 分頁
- 模板解析器
- 動態解析器語法
- 隊列消息
- 請求與輸入
- 響應
- 視圖
- 路由器
- 配置
- 驗證操作
- 處理錯誤消息
- 錯誤消息與視圖
- 可用的驗證規則
- 有條件的驗證規則
- 驗證數組
- 錯誤消息
- 自定義驗證規則
- 模型操作
- 定義模型與其屬性
- 檢索模型
- 插入與更新
- 刪除模型
- 查詢范圍
- 事件操作
- 關聯操作
- 定義關系
- 關系類型
- 多肽關系
- 關系查詢
- 渴望加載
- 插入模型
- 數據庫操作
- 基本用法
- 數據表結構
- 查詢連貫操作
- 結果檢索
- select子句
- 插入更新
- where子句
- 排序,分組,限制和偏移
- 文件附件
- Collection操作
- 屬性操作
- 系列化json
- 數據庫屬性
- 數據庫行為
- 控制器
- 后臺控制器定義
- 后臺頁面
- 后臺組件
- 后臺表單
- 表單組件
- 表單視圖
- 表單行為
- 后臺列表
- 列表行為
- 列表過濾器
- 可用列類型
- 關系行為
- 關系行為類型
- 擴展關系行為
- 列表排序操作
- 導入導出操作
- 用于與權限
- corlate模板修改
- 修改頂部導航
- laravel問題
- 控制器不存在
- 控制器
- 路由組
- laravel筆記
- laravel 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖