表单验证
<h1>表单验证</h1>
<h3>rule</h3>
<p><code>model-form</code>使用laravel的验证规则来验证表单提交的数据:</p>
<pre><code class="language-php">$form-&gt;text('title')-&gt;rules('required|min:3');
// 复杂的验证规则可以在回调里面实现
$form-&gt;text('title')-&gt;rules(function (Form $form) {
// 如果不是编辑状态,则添加字段唯一验证
if (!$id = $form-&gt;model()-&gt;id) {
return 'unique:users,email_address';
}
});</code></pre>
<p>也可以给验证规则自定义错误提示消息:</p>
<pre><code class="language-php">$form-&gt;text('code')-&gt;rules('required|regex:/^\d+$/|min:10', [
'regex' =&gt; 'code必须全部为数字',
'min' =&gt; 'code不能少于10个字符',
]);</code></pre>
<p>如果要允许字段为空,首先要在数据库的表里面对该字段设置为<code>NULL</code>,然后</p>
<pre><code class="language-php">$form-&gt;text('title')-&gt;rules('nullable');</code></pre>
<p>更多规则请参考<a href="https://laravel.com/docs/5.5/validation">Validation</a>。</p>
<h3>creationRules</h3>
<p>此方法用法和<code>Form\Field::rule</code>用法完全一致,不同的是此方法只有在新增数据时才有效。</p>
<p>> {tip} 如果调用了<code>creationRules</code>方法,则<code>rule</code>方法设置的验证规则将会被忽略。</p>
<h3>updateRules</h3>
<p>此方法用法和<code>Form\Field::rule</code>用法完全一致,不同的是此方法只有在更新数据时才有效。</p>
<p>> {tip} 如果调用了<code>updateRules</code>方法,则<code>rule</code>方法设置的验证规则将会被忽略。</p>
<h2>responseValidationMessages</h2>
<p>通过<code>Form::responseValidationMessages</code>方法可以返回自定义验证错误信息,并中断后续逻辑,用法如下:</p>
<pre><code class="language-php">// 编辑提交时是“PUT”方法
if (request()-&gt;getMethod() == 'PUT') {
if (...) { // 你的验证逻辑
$form-&gt;responseValidationMessages('title', 'title格式错误');
// 如有多个错误信息,第二个参数可以传数组
$form-&gt;responseValidationMessages('content', ['content格式错误', 'content不能为空']);
}
}
$form-&gt;text('title');
$form-&gt;text('content');</code></pre>
<p>也可以在<code>submitted</code>事件中使用这个方法</p>
<pre><code class="language-php">$form-&gt;submitted(function ($form) {
if (...) { // 你的验证逻辑
$form-&gt;responseValidationMessages('title', 'title格式错误');
// 如有多个错误信息,第二个参数可以传数组
$form-&gt;responseValidationMessages('content', ['content格式错误', 'content不能为空']);
}
});</code></pre>
<h2>前端验证</h2>
<p>系统继承了<a href="<a href="https://github.com/1000hz/bootstrap-validator"">https://github.com/1000hz/bootstrap-validator"</a>; target="_blank">bootstrap-validator</a>进行前端表单验证,支持H5表单类型的验证。</p>
<p>> {tip} 不支持H5的浏览器也可以使用前端验证,系统已经做好了兼容。大部分表单都支持前端和后端验证,两者可以同时工作不冲突,少部分表单前端验证无效。</p>
<h3>H5验证</h3>
<h4>required</h4>
<p>必填</p>
<pre><code class="language-php">$form-&gt;text('title')-&gt;required();</code></pre>
<h4>number</h4>
<p>只允许输入数字</p>
<pre><code class="language-php">$form-&gt;text('age')-&gt;type('number');</code></pre>
<p>限制范围</p>
<pre><code class="language-php">// 只允许输入 10-60 范围内的数字
$form-&gt;text('age')
-&gt;type('number')
-&gt;attribute('min', 10)
-&gt;attribute('max', 60);</code></pre>
<h4>email</h4>
<p>邮箱</p>
<pre><code class="language-php">$form-&gt;email('email');</code></pre>
<h4>url</h4>
<p>链接</p>
<pre><code class="language-php">$form-&gt;text('website')-&gt;type('url');</code></pre>
<h3>其它</h3>
<h4>minLength</h4>
<p>限制字符最小长度</p>
<pre><code class="language-php">$form-&gt;text('title')-&gt;minLength(20);
// 设置错误信息
$form-&gt;text('title')-&gt;minLength(20, '最少输入20个字符');</code></pre>
<h4>maxLength</h4>
<p>限制字符最大长度</p>
<pre><code class="language-php">$form-&gt;text('title')-&gt;maxLength(50);
// 设置错误信息
$form-&gt;text('title')-&gt;minLength(50, '不能超过50个字符');</code></pre>
<h4>same</h4>
<p>限制当前字段值必须与给定字段的值相等,常用于密码确认</p>
<pre><code class="language-php">$form-&gt;password('password');
$form-&gt;password('password_confirm')-&gt;same('password');
// 设置错误信息
$form-&gt;password('password_confirm')-&gt;same('password', '两次密码输入不一致');</code></pre>
<h3>自定义</h3>
<p>开发者可以通过以下方法自定义前端验证规则。</p>
<p>在 <code>app/Admin/bootstrap.php</code> 中添加以下代码。</p>
<pre><code class="language-php">use Dcat\Admin\Form\Field;
Field\Text::macro('len', function (int $length, ?string $error = null) {
// 前端验证逻辑扩展
Admin::script(
&lt;&lt;&lt;'JS'
Dcat.validator.extend('len', function ($el) {
return $el.val().length != $el.attr('data-len');
});
JS
);
// 同时添加后端验证逻辑,这个可以看需要
$this-&gt;rules('size:'.$length);
return $this-&gt;attribute([
'data-len' =&gt; $length,
'data-len-error' =&gt; str_replace(
[':attribute', ':len'],
[$this-&gt;label, $length],
$error ?: &quot;只能输入:len个字符&quot;
),
]);
});</code></pre>
<p>使用</p>
<pre><code class="language-php">$form-&gt;text('name')-&gt;len(10);</code></pre>