dcat-admin

dcat-admin


表单验证

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

页面列表

ITEM_HTML