<article><h1>Laravel 的表單驗證機制詳解</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#validation-quickstart">快速上手</a><ul><li><a href="#quick-defining-the-routes">定義路由</a></li><li><a href="#quick-creating-the-controller">創建控制器</a></li><li><a href="#quick-writing-the-validation-logic">編寫驗證邏輯</a></li><li><a href="#quick-displaying-the-validation-errors">顯示驗證錯誤</a></li><li><a href="#a-note-on-optional-fields">有關可選字段的注意事項</a></li></ul></li><li><a href="#form-request-validation">表單請求驗證</a><ul><li><a href="#creating-form-requests">創建表單請求</a></li><li><a href="#authorizing-form-requests">授權表單請求</a></li><li><a href="#customizing-the-error-format">自定義錯誤格式</a></li><li><a href="#customizing-the-error-messages">自定義錯誤消息</a></li></ul></li><li><a href="#manually-creating-validators">手動創建表單驗證</a><ul><li><a href="#automatic-redirection">自動重定向</a></li><li><a href="#named-error-bags">命名錯誤包</a></li><li><a href="#after-validation-hook">驗證后鉤子</a></li></ul></li><li><a href="#working-with-error-messages">處理錯誤消息</a><ul><li><a href="#custom-error-messages">自定義錯誤消息</a></li></ul></li><li><a href="#available-validation-rules">可用的驗證規則</a></li><li><a href="#conditionally-adding-rules">按條件增加規則</a></li><li><a href="#validating-arrays">驗證數組</a></li><li><a href="#custom-validation-rules">自定義驗證規則</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">Introduction</a></h2><p>Laravel 提供了多種不同的驗證方法來對應用程序傳入的數據進行驗證。默認情況下,Laravel 的基類控制器使用 <code class=" language-php">ValidatesRequests</code> Trait,它提供了方便的方法使用各種強大的驗證規則來驗證傳入的 HTTP 請求數據。</p><p><a name="validation-quickstart"></a></p><h2><a href="#validation-quickstart">快速上手</a></h2><p>為了了解 Laravel 強大驗證特性,我們先來看看一個完整的表單驗證并返回錯誤消息的示例。</p><p><a name="quick-defining-the-routes"></a></p><h3>定義路由</h3><p>首先,我們假定在 <code class=" language-php">routes<span class="token operator">/</span>web<span class="token punctuation">.</span>php</code> 文件中定義了以下路由:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'post/create'</span><span class="token punctuation">,</span> <span class="token string">'PostController@create'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">post<span class="token punctuation">(</span></span><span class="token string">'post'</span><span class="token punctuation">,</span> <span class="token string">'PostController@store'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><code class=" language-php"><span class="token constant">GET</span></code> 路由會顯示一個用于創建新博客文章的表單,<code class=" language-php"><span class="token constant">POST</span></code> 路由則會將新的博客文章保存到數據庫。</p><p><a name="quick-creating-the-controller"></a></p><h3>創建控制器</h3><p>下一步,我們來看一個處理這些路由的簡單的控制器。我們將 <code class=" language-php">store</code> 方法置空:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Request</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers<span class="token punctuation">\</span>Controller</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">PostController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* 顯示創建博客文章的表單。
*
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">create<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'post.create'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">/**
* 保存一個新的博客文章。
*
* @param Request $request
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">store<span class="token punctuation">(</span></span>Request <span class="token variable">$request</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> // 驗證以及保存博客發表文章...
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="quick-writing-the-validation-logic"></a></p><h3>編寫驗證邏輯</h3><p>現在我們準備開始編寫 <code class=" language-php">store</code> 邏輯方法來驗證我們博客發布的新文章。檢查應用程序的基底控制器 (<code class=" language-php">App\<span class="token package">Http<span class="token punctuation">\</span>Controllers<span class="token punctuation">\</span>Controller</span></code>) 類你會看到這個類使用了 <code class=" language-php">ValidatesRequests</code> Trait。這個 Trait 在你所有的控制器里提供了方便的 <code class=" language-php">validate</code> 驗證方法。</p><p><code class=" language-php">validate</code> 方法會接收 HTTP 傳入的請求以及驗證的規則。如果驗證通過,你的代碼就可以正常的運行。若驗證失敗,則會拋出異常錯誤消息并自動將其返回給用戶。在一般的 HTTP 請求下,都會生成一個重定向響應,而對于 AJAX 請求則會發送 JSON 響應。</p><p>讓我們接著回到 <code class=" language-php">store</code> 方法來深入理解 <code class=" language-php">validate</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 保存一篇新的博客文章。
*
* @param Request $request
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">store<span class="token punctuation">(</span></span>Request <span class="token variable">$request</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validate<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true"> // 文章內容是符合規則的,存入數據庫
</span><span class="token punctuation">}</span></code></pre><p>如你所見,我們將本次 HTTP 請求及所需的驗證規則傳遞至 <code class=" language-php">validate</code> 方法中。另外再提醒一次,如果驗證失敗,將會自動生成一個對應的響應。如果驗證通過,那我們的控制器將會繼續正常運行。</p><h4>在第一次驗證失敗后停止</h4><p>有時,你希望在某個屬性第一次驗證失敗后停止運行驗證規則。為了達到這個目的,附加 <code class=" language-php">bail</code> 規則到該屬性:</p><pre class=" language-php"><code class=" language-php"><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validate<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'bail|required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>在這個例子里,如果 title 字段 沒有通過 <code class=" language-php">required</code> 的驗證規則,那么 <code class=" language-php">unique</code> 這個規則將不會被檢測了。將按規則被分配的順序來驗證規則。</p><h4>嵌套屬性的注解</h4><p>如果你的 HTTP 請求包含一個 「嵌套的」 參數,你可以在驗證規則中通過 「點」 語法來指定這些參數。</p><pre class=" language-php"><code class=" language-php"><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validate<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'author.name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token string">'author.description'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="quick-displaying-the-validation-errors"></a></p><h3>顯示驗證錯誤</h3><p>如果本次請求的參數未通過我們指定的驗證規則呢?正如前面所提到的,Laravel 會自動把用戶重定向到先前的位置。另外,所有的驗證錯誤會被自動 <a href="/docs/5.4/session#flash-data">閃存至 session</a>。</p><p>再者,請注意在 <code class=" language-php"><span class="token constant">GET</span></code> 路由中,我們無需顯式的將錯誤信息和視圖綁定起來。這是因為 Lavarel 會檢查在 Session 數據中的錯誤信息,然后如果對應的視圖存在的話,自動將它們綁定起來。變量 <code class=" language-php"><span class="token variable">$errors</span></code> 會成為 <code class=" language-php">Illuminate\<span class="token package">Support<span class="token punctuation">\</span>MessageBag</span></code> 的一個實例對象。要獲取關于這個對象的更多信息,請<a href="#working-with-error-messages">查閱這個文檔</a>。</p><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> <code class=" language-php"><span class="token variable">$errors</span></code> 變量被 <code class=" language-php">Illuminate\<span class="token package">View<span class="token punctuation">\</span>Middleware<span class="token punctuation">\</span>ShareErrorsFromSession</span></code> 中間件綁定到視圖,該中間件由 <code class=" language-php">web</code> 中間件組提供。<strong>當這個中間件被應用后,在你的視圖中就可以獲取到 <code class=" language-php"><span class="token variable">$error</span></code> 變量</strong>,可以使你方便的假定 <code class=" language-php"><span class="token variable">$errors</span></code> 變量總是已經被定義好并且可以安全的使用。</p></blockquote><p>所以,在我們的例子中,當驗證失敗的時候,用戶將會被重定向到 <code class=" language-php">create</code> 方法,讓我們在視圖中顯示錯誤信息:</p><pre class=" language-php"><code class=" language-php"><span class="token markup"><span class="token comment" spellcheck="true"><!-- /resources/views/post/create.blade.php --></span></span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span></span>創建文章<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span></span>
@<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">count<span class="token punctuation">(</span></span><span class="token variable">$errors</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>alert alert-danger<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span></span>
@<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$error</span><span class="token punctuation">)</span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span></span><span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$error</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span></span>
@<span class="token keyword">endforeach</span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span></span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></span>
@<span class="token keyword">endif</span>
<span class="token markup"><span class="token comment" spellcheck="true"><!-- 創建文章表單 --></span></span></code></pre><p><a name="a-note-on-optional-fields"></a></p><h3>有關可選字段的注意事項</h3><p>默認情況下,Laravel 會在你的應用中的全局中間件棧中包含 <code class=" language-php">TrimStrings</code> 和 <code class=" language-php">ConvertEmptyStringsToNull</code> 中間件。這些中間件在 <code class=" language-php">App\<span class="token package">Http<span class="token punctuation">\</span>Kernel</span></code> 類中。因此,如果您不希望驗證程序將「null」值視為無效的,您通常需要將「可選」的請求字段標記為 <code class=" language-php">nullable</code>。</p><pre class=" language-php"><code class=" language-php"><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validate<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token string">'publish_at'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'nullable|date'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>在這個例子里,我們指定 <code class=" language-php">publish_at</code> 字段可以為 <code class=" language-php"><span class="token keyword">null</span></code> 或者一個有效的日期格式。如果 <code class=" language-php">nullable</code> 的修飾詞沒有添加到規則定義中,驗證器會認為 <code class=" language-php"><span class="token keyword">null</span></code> 是一個無效的日期格式。</p><p><a name="quick-customizing-the-flashed-error-format"></a></p><h4>自定義閃存的錯誤消息格式</h4><p>當驗證失敗時,如果你想要在閃存上自定義驗證的錯誤格式,則需在控制器中重寫 <code class=" language-php">formatValidationErrors</code>。別忘了將 <code class=" language-php">Illuminate\<span class="token package">Contracts<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Validator</span></code> 類引入到文件上方:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Bus<span class="token punctuation">\</span>DispatchesJobs</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Contracts<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Validator</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Routing<span class="token punctuation">\</span>Controller</span> <span class="token keyword">as</span> BaseController<span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Foundation<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>ValidatesRequests</span><span class="token punctuation">;</span>
<span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Controller</span> <span class="token keyword">extends</span> <span class="token class-name">BaseController</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">DispatchesJobs</span><span class="token punctuation">,</span> ValidatesRequests<span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* {@inheritdoc}
*/</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">formatValidationErrors<span class="token punctuation">(</span></span>Validator <span class="token variable">$validator</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errors<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p><a name="quick-ajax-requests-and-validation"></a></p><h4>AJAX 請求驗證</h4><p>在這個例子中,我們使用一種傳統的方式來將數據發送到應用程序上。當我們在 AJAX 的請求中使用 <code class=" language-php">validate</code> 方法時,Laravel 并不會生成一個重定向響應,而是會生成一個包含所有錯誤驗證的 JSON 響應。這個 JSON 響應會發送一個 422 HTTP 狀態碼。</p><p><a name="form-request-validation"></a></p><h2><a href="#form-request-validation">表單請求驗證</a></h2><p><a name="creating-form-requests"></a></p><h3>創建表單請求</h3><p>在更復雜的驗證情境中,你可能會想要創建一個「表單請求( form request )」。表單請求是一個自定義的請求類,里面包含著驗證邏輯。要創建一個表單請求類,可使用 Artisan 命令行命令 <code class=" language-php">make<span class="token punctuation">:</span>request</code> :</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>request StoreBlogPost</code></pre><p>The generated class will be placed in the <code class=" language-php">app<span class="token operator">/</span>Http<span class="token operator">/</span>Requests</code> directory. If this directory does not exist, it will be created when you run the <code class=" language-php">make<span class="token punctuation">:</span>request</code> command. Let's add a few validation rules to the <code class=" language-php">rules</code> method:</p><p>新生成的類保存在 <code class=" language-php">app<span class="token operator">/</span>Http<span class="token operator">/</span>Requests</code> 目錄下。如果這個目錄不存在,那么將會在你運行 <code class=" language-php">make<span class="token punctuation">:</span>request</code> 命令時創建出來。讓我們添加一些驗證規則到 <code class=" language-php">rules</code> 方法中:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取適用于請求的驗證規則。
*
* @return array
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">rules<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>怎樣才能較好的運行驗證規則呢?你所需要做的就是在控制器方法中利用類型提示傳入請求。傳入的請求會在控制器方法被調用前進行驗證,意思就是說你不會因為驗證邏輯而把控制器弄得一團糟:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 保存傳入的博客文章。?
*
* @param StoreBlogPost $request
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">store<span class="token punctuation">(</span></span>StoreBlogPost <span class="token variable">$request</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> // The incoming request is valid...
</span><span class="token punctuation">}</span></code></pre><p>如果驗證失敗,就會生成一個重定向響應把用戶返回到先前的位置。這些錯誤會被閃存到 Session,所以這些錯誤都可以被顯示。如果進來的是 AJAX 請求的話,則會傳回一個 HTTP 響應,其中包含了 422 狀態碼和驗證錯誤的 JSON 數據。</p><h4>添加表單請求后鉤子</h4><p>如果你想在表單請求「之后」添加鉤子,你可以使用 <code class=" language-php">withValidator</code> 方法。這個方法接收一個完整的驗證類,允許你在實際判斷驗證規則調之前調用驗證類的所有方法:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* @param \Illuminate\Validation\Validator $validator
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">withValidator<span class="token punctuation">(</span></span><span class="token variable">$validator</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">after<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$validator</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">somethingElseIsInvalid<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errors<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">add<span class="token punctuation">(</span></span><span class="token string">'field'</span><span class="token punctuation">,</span> <span class="token string">'Something is wrong with this field!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="authorizing-form-requests"></a></p><h3>授權表單請求</h3><p>表單的請求類內包含了 <code class=" language-php">authorize</code> 方法。在這個方法中,你可以確認用戶是否真的通過了授權,以便更新指定數據。比方說,有一個用戶想試圖去更新一篇文章的評論,你能保證他確實是這篇評論的擁有者嗎?具體代碼如下:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 判斷用戶是否有權限做出此請求。
*
* @return bool
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">authorize<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$comment</span> <span class="token operator">=</span> <span class="token scope">Comment<span class="token punctuation">::</span></span><span class="token function">find<span class="token punctuation">(</span></span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">route<span class="token punctuation">(</span></span><span class="token string">'comment'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token variable">$comment</span> <span class="token operator">&&</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">can<span class="token punctuation">(</span></span><span class="token string">'update'</span><span class="token punctuation">,</span> <span class="token variable">$comment</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>由于所有的表單請求都是擴展于基礎的 Laravel 請求類,所以我們可以使用 <code class=" language-php">user</code> 方法去獲取當前認證登錄的用戶。同時請注意上述例子中對 <code class=" language-php">route 方法的調用。這個方法授權你獲取調用的路由規則中的 <span class="token constant">URI</span> 參數,譬如下面例子中的</code>{comment}`參數:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">post<span class="token punctuation">(</span></span><span class="token string">'comment/{comment}'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>如果 <code class=" language-php">authorize</code> 方法返回 <code class=" language-php"><span class="token boolean">false</span></code>,則會自動返回一個 HTTP 響應,其中包含 403 狀態碼,而你的控制器方法也將不會被運行。</p><p>如果你打算在應用程序的其它部分處理授權邏輯,只需從 <code class=" language-php">authorize</code> 方法返回 <code class=" language-php"><span class="token boolean">true</span></code> :</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 判斷用戶是否有權限做出此請求。
*
* @return bool
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">authorize<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="customizing-the-error-format"></a></p><h3>自定義錯誤格式</h3><p>如果你想要自定義驗證失敗時閃存到 Session 的驗證錯誤格式,可在你的基底請求 (App\Http\Requests\Request) 中重寫 <code class=" language-php">formatErrors</code>。別忘了文件上方引入 <code class=" language-php">Illuminate\<span class="token package">Contracts<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Validator</span></code> 類:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* {@inheritdoc}
*/</span>
<span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">formatErrors<span class="token punctuation">(</span></span>Validator <span class="token variable">$validator</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errors<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="customizing-the-error-messages"></a></p><h3>自定義錯誤消息</h3><p>你可以通過重寫表單請求的 <code class=" language-php">messages</code> 方法來自定義錯誤消息。此方法必須返回一個數組,其中含有成對的屬性或規則以及對應的錯誤消息:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 獲取已定義驗證規則的錯誤消息。
*
* @return array
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">messages<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span>
<span class="token string">'title.required'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'A title is required'</span><span class="token punctuation">,</span>
<span class="token string">'body.required'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'A message is required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="manually-creating-validators"></a></p><h2><a href="#manually-creating-validators">手動創建驗證請求</a></h2><p>如果你不想要使用 <code class=" language-php">ValidatesRequests</code> Trait 的 <code class=" language-php">validate</code> 方法,你可以手動創建一個 validator 實例并通過 <code class=" language-php"><span class="token scope">Validator<span class="token punctuation">::</span></span>make</code> 方法在 <a href="/docs/5.4/facades">Facade</a> 生成一個新的 <code class=" language-php">validator</code> 實例:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Validator</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Request</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers<span class="token punctuation">\</span>Controller</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">PostController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* 保存一篇新的博客文章。
*
* @param Request $request
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">store<span class="token punctuation">(</span></span>Request <span class="token variable">$request</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$validator</span> <span class="token operator">=</span> <span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">fails<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">redirect<span class="token punctuation">(</span></span><span class="token string">'post/create'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">withErrors<span class="token punctuation">(</span></span><span class="token variable">$validator</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">withInput<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true"> // 保存文章
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>第一個傳給 <code class=" language-php">make</code> 方法的參數是驗證數據。第二個參數則是數據的驗證規則。</p><p>如果請求沒有通過驗證,則可以使用 <code class=" language-php">withErrors</code> 方法把錯誤消息閃存到 Session。在進行重定向之后,<code class=" language-php"><span class="token variable">$errors</span></code> 變量可以在視圖中自動共用,讓你可以輕松地顯示這些消息并返回給用戶。<code class=" language-php">withErrors</code> 方法接收 validator、MessageBag,或 PHP array。</p><p><a name="automatic-redirection"></a></p><h3>自動重定向</h3><p>如果你想手動創建一個驗證器實例,但希望繼續享用 <code class=" language-php">ValidatesRequest</code> 特性提供的自動跳轉功能,那么你可以調用一個現存的驗證器實例中的 <code class=" language-php">validate</code> 方法。如果驗證失敗了,用戶會被自動重定向,或者在 AJAX 請求中,一個 JSON 格式的響應將會被返回:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'title'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|unique:posts|max:255'</span><span class="token punctuation">,</span>
<span class="token string">'body'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">validate<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="named-error-bags"></a></p><h3>命名錯誤包</h3><p>如果你在一個一個頁面中有多個表單,你也許會希望命名錯誤信息包 <code class=" language-php">MessageBag</code> ,錯誤信息包允許你從指定的表單中接收錯誤信息。簡單的給 <code class=" language-php">withErrors</code> 方法傳遞第二個參數作為一個名字:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">return</span> <span class="token function">redirect<span class="token punctuation">(</span></span><span class="token string">'register'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">withErrors<span class="token punctuation">(</span></span><span class="token variable">$validator</span><span class="token punctuation">,</span> <span class="token string">'login'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>然后你能從 <code class=" language-php"><span class="token variable">$errors</span></code> 變量中獲取到 <code class=" language-php">MessageBag</code> 實例:</p><pre class=" language-php"><code class=" language-php"><span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">login</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">first<span class="token punctuation">(</span></span><span class="token string">'email'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><a name="after-validation-hook"></a></p><h3>驗證后鉤子</h3><p>驗證器允許你在驗證完成之后附加回調函數。這使得你可以容易的執行進一步驗證,甚至可以在消息集合中添加更多的錯誤信息。使用它只需在驗證實例中使用 <code class=" language-php">after</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$validator</span> <span class="token operator">=</span> <span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">after<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$validator</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">somethingElseIsInvalid<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errors<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">add<span class="token punctuation">(</span></span><span class="token string">'field'</span><span class="token punctuation">,</span> <span class="token string">'Something is wrong with this field!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">fails<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><p><a name="working-with-error-messages"></a></p><h2><a href="#working-with-error-messages">處理錯誤消息</a></h2><p>調用 <code class=" language-php">Validator</code> 實例的 <code class=" language-php">errors</code> 方法,會得到一個 <code class=" language-php">Illuminate\<span class="token package">Support<span class="token punctuation">\</span>MessageBag</span></code> 的實例,里面有許多可讓你操作錯誤消息的便利方法。<code class=" language-php"><span class="token variable">$errors</span></code> 值可以自動的被所有的視圖獲取,并且是一個MessageBag類的實例。自動對所有視圖可用的 <code class=" language-php"><span class="token variable">$errors</span></code> 變量也是 <code class=" language-php">MessageBag</code> 類的一個實例。</p><h4>查看特定字段的第一個錯誤消息</h4><p>如果要查看特定字段的第一個錯誤消息,可以使用 <code class=" language-php">first</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$errors</span> <span class="token operator">=</span> <span class="token variable">$validator</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errors<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">first<span class="token punctuation">(</span></span><span class="token string">'email'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>查看特定字段的所有錯誤消息</h4><p>如果你想通過指定字段來簡單的獲取所有消息中的一個數組,則可以使用 <code class=" language-php">get</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'email'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><p>如果你正在驗證的一個表單字段類型是數組,你可以使用 <code class=" language-php"><span class="token operator">*</span></code> 來獲取每個元素的所有錯誤信息:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'attachments.*'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><h4>查看所有字段的所有錯誤消息</h4><p>如果你想要得到所有字段的消息數組,則可以使用 <code class=" language-php">all</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><h4>判斷特定字段是否含有錯誤消息</h4><p>可以使用 <code class=" language-php">has</code> 方法來檢測一個給定的字段是否存在錯誤信息:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$errors</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">has<span class="token punctuation">(</span></span><span class="token string">'email'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><p><a name="custom-error-messages"></a></p><h3>自定義錯誤消息</h3><p>如果有需要的話,你也可以自定義錯誤的驗證消息來取代默認的驗證消息。有幾種方法可以指定自定義消息。首先,你需要先通過傳遞三個參數到 <code class=" language-php"><span class="token scope">Validator<span class="token punctuation">::</span></span>make</code> 方法來自定義驗證消息:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$messages</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string">'required'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'The :attribute field is required.'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token variable">$validator</span> <span class="token operator">=</span> <span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$input</span><span class="token punctuation">,</span> <span class="token variable">$rules</span><span class="token punctuation">,</span> <span class="token variable">$messages</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>在這個例子中,<code class=" language-php"><span class="token punctuation">:</span>attribute</code> 占位符會被通過驗證的字段實際名稱所取代。除此之外,你還可以使用其它默認字段的驗證提示消息。例如:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$messages</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string">'same'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'The :attribute and :other must match.'</span><span class="token punctuation">,</span>
<span class="token string">'size'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'The :attribute must be exactly :size.'</span><span class="token punctuation">,</span>
<span class="token string">'between'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'The :attribute must be between :min - :max.'</span><span class="token punctuation">,</span>
<span class="token string">'in'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'The :attribute must be one of the following types: :values'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre><h4>指定自定義消息到特定的屬性</h4><p>有時候你可能想要對特定的字段來自定義錯誤消息。只需在屬性名稱后加上「.」符號和指定驗證的規則即可:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$messages</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string">'email.required'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'We need to know your e-mail address!'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre><p><a name="localization"></a></p><h4>在語言文件中指定自定義的消息提示</h4><p>多數情況下,你會在語言文件中指定自定義的消息提示,而不是將定制的消息傳遞給 <code class=" language-php">Validator</code> 。實現它需要在語言文件 <code class=" language-php">resources<span class="token operator">/</span>lang<span class="token operator">/</span>xx<span class="token operator">/</span>validation<span class="token punctuation">.</span>php</code> 中,將定制的消息添加到 <code class=" language-php">custom</code> 數組。</p><pre class=" language-php"><code class=" language-php"><span class="token string">'custom'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'required'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'We need to know your e-mail address!'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><h4>在語言文件中自定義屬性</h4><p>如果希望將驗證消息的<code class=" language-php"><span class="token punctuation">:</span>attribute</code> 部分替換為自定義屬性名稱,則可以在 <code class=" language-php">resources<span class="token operator">/</span>lang<span class="token operator">/</span>xx<span class="token operator">/</span>validation<span class="token punctuation">.</span>php</code> 語言文件的 <code class=" language-php">attributes</code> 數組中指定自定義名稱:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'attributes'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'email address'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p><a name="available-validation-rules"></a></p><h2><a href="#available-validation-rules">可用的驗證規則</a></h2><p>以下是所有可用的驗證規則清單與功能:</p><style>.collection-method-list > p {
column-count: 3; -moz-column-count: 3; -webkit-column-count: 3;
column-gap: 2em; -moz-column-gap: 2em; -webkit-column-gap: 2em;
}
.collection-method-list a {
display: block;
}</style><div class="collection-method-list"><p><a href="#rule-accepted">Accepted</a> <a href="#rule-active-url">Active URL</a> <a href="#rule-after">After (Date)</a> <a href="#rule-after-or-equal">After Or Equal (Date)</a> <a href="#rule-alpha">Alpha</a> <a href="#rule-alpha-dash">Alpha Dash</a> <a href="#rule-alpha-num">Alpha Numeric</a> <a href="#rule-array">Array</a> <a href="#rule-before">Before (Date)</a> <a href="#rule-before-or-equal">Before Or Equal (Date)</a> <a href="#rule-between">Between</a> <a href="#rule-boolean">Boolean</a> <a href="#rule-confirmed">Confirmed</a> <a href="#rule-date">Date</a> <a href="#rule-date-format">Date Format</a> <a href="#rule-different">Different</a> <a href="#rule-digits">Digits</a> <a href="#rule-digits-between">Digits Between</a> <a href="#rule-dimensions">Dimensions (Image Files)</a> <a href="#rule-distinct">Distinct</a> <a href="#rule-email">E-Mail</a> <a href="#rule-exists">Exists (Database)</a> <a href="#rule-file">File</a> <a href="#rule-filled">Filled</a> <a href="#rule-image">Image (File)</a> <a href="#rule-in">In</a> <a href="#rule-in-array">In Array</a> <a href="#rule-integer">Integer</a> <a href="#rule-ip">IP Address</a> <a href="#rule-json">JSON</a> <a href="#rule-max">Max</a> <a href="#rule-mimetypes">MIME Types</a> <a href="#rule-mimes">MIME Type By File Extension</a> <a href="#rule-min">Min</a> <a href="#rule-nullable">Nullable</a> <a href="#rule-not-in">Not In</a> <a href="#rule-numeric">Numeric</a> <a href="#rule-present">Present</a> <a href="#rule-regex">Regular Expression</a> <a href="#rule-required">Required</a> <a href="#rule-required-if">Required If</a> <a href="#rule-required-unless">Required Unless</a> <a href="#rule-required-with">Required With</a> <a href="#rule-required-with-all">Required With All</a> <a href="#rule-required-without">Required Without</a> <a href="#rule-required-without-all">Required Without All</a> <a href="#rule-same">Same</a> <a href="#rule-size">Size</a> <a href="#rule-string">String</a> <a href="#rule-timezone">Timezone</a> <a href="#rule-unique">Unique (Database)</a> <a href="#rule-url">URL</a></p></div><p><a name="rule-accepted"></a></p><h4>accepted</h4><p>驗證字段值是否為 <em>yes</em>、<em>on</em>、<em>1</em>、或 <em>true</em>。這在確認「服務條款」是否同意時相當有用。</p><p><a name="rule-active-url"></a></p><h4>active_url</h4><p>根據 PHP 函數 <code class=" language-php">dns_get_record</code>,判斷要驗證的字段必須具有有效的 A 或 AAAA 記錄。</p><p><a name="rule-after"></a></p><h4>after:<em>date</em></h4><p>驗證字段是否是在指定日期之后。這個日期將會通過 <code class=" language-php">strtotime</code> 函數來驗證。</p><pre class=" language-php"><code class=" language-php"><span class="token string">'start_date'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|date|after:tomorrow'</span></code></pre><p>作為替換 <code class=" language-php">strtotime</code> 傳遞的日期字符串,你可以指定其它的字段來比較日期:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'finish_date'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|date|after:start_date'</span></code></pre><p><a name="rule-after-or-equal"></a></p><h4>after_or_equal:<em>date</em></h4><p>驗證字段必需是等于指定日期或在指定日期之后。更多信息請參見 <a href="#rule-after">after</a> 規則。</p><p><a name="rule-alpha"></a></p><h4>alpha</h4><p>驗證字段值是否僅包含字母字符。</p><p><a name="rule-alpha-dash"></a></p><h4>alpha_dash</h4><p>驗證字段值是否僅包含字母、數字、破折號( - )以及下劃線( _ )。</p><p><a name="rule-alpha-num"></a></p><h4>alpha_num</h4><p>驗證字段值是否僅包含字母、數字。</p><p><a name="rule-array"></a></p><h4>array</h4><p>驗證字段必須是一個 PHP 數組。</p><p><a name="rule-before"></a></p><h4>before:<em>date</em></h4><p>驗證字段是否是在指定日期之前。這個日期將會通過 <code class=" language-php">strtotime</code> 函數來驗證。</p><p><a name="rule-before-or-equal"></a></p><h4>before_or_equal:<em>date</em></h4><p>驗證字段是否是在指定日期之前。這個日期將會使用 PHP <code class=" language-php">strtotime</code> 函數來驗證。</p><p><a name="rule-between"></a></p><h4>between:<em>min</em>,<em>max</em></h4><p>驗證字段值的大小是否介于指定的 <em>min</em> 和 <em>max</em> 之間。字符串、數值或是文件大小的計算方式和 <a href="#rule-size"><code class=" language-php">size</code></a> 規則相同。</p><p><a name="rule-boolean"></a></p><h4>boolean</h4><p>驗證字段值是否能夠轉換為布爾值。可接受的參數為 <code class=" language-php"><span class="token boolean">true</span></code>、<code class=" language-php"><span class="token boolean">false</span></code>、<code class=" language-php"><span class="token number">1</span></code>、<code class=" language-php"><span class="token number">0</span></code>、<code class=" language-php"><span class="token string">"1"</span></code> 以及 <code class=" language-php"><span class="token string">"0"</span></code>。</p><p><a name="rule-confirmed"></a></p><h4>confirmed</h4><p>驗證字段值必須和 <code class=" language-php">foo_confirmation</code> 的字段值一致。例如,如果要驗證的字段是 <code class=" language-php">password</code>,就必須和輸入數據里的 <code class=" language-php">password_confirmation</code> 的值保持一致。</p><p><a name="rule-date"></a></p><h4>date</h4><p>驗證字段值是否為有效日期,會根據 PHP 的 <code class=" language-php">strtotime</code> 函數來做驗證。</p><p><a name="rule-date-format"></a></p><h4>date_format:<em>format</em></h4><p>驗證字段值符合指定的日期格式 (<em>format</em>)。你應該只使用 <code class=" language-php">date</code> 或 <code class=" language-php">date_format</code> 當中的 <strong>其中一個</strong> 用于驗證,而不應該同時使用兩者。</p><p><a name="rule-different"></a></p><h4>different:<em>field</em></h4><p>驗證字段值是否和指定的字段 (<em>field</em>) 有所不同。</p><p><a name="rule-digits"></a></p><h4>digits:<em>value</em></h4><p>驗證字段值是否為 <em>numeric</em> 且長度為 <em>value</em>。</p><p><a name="rule-digits-between"></a></p><h4>digits_between:<em>min</em>,<em>max</em></h4><p>驗證字段值的長度是否在 <em>min</em> 和 <em>max</em> 之間。</p><p><a name="rule-dimensions"></a></p><h4>dimensions</h4><p>驗證的文件必須是圖片并且圖片比例必須符合規則:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'avatar'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'dimensions:min_width=100,min_height=200'</span></code></pre><p>可用的規則為: <em>min_width</em>,<em>max_width</em>,<em>min_height</em>,<em>max_height</em>,<em>width</em>,<em>height</em>,<em>ratio</em>。</p><p>比例應該使用寬度除以高度的方式出現。能夠使用 3/2 這樣的形式設置,也可以使用 1.5 這樣的浮點方式:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'avatar'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'dimensions:ratio=3/2'</span></code></pre><p>Since this rule requires several arguments, you may use the method to fluently construct the rule:</p><p>由于此規則需要多個參數,因此您可以 <code class=" language-php"><span class="token scope">Rule<span class="token punctuation">::</span></span>dimensions</code> 方法來構造規則:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Rule</span><span class="token punctuation">;</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'avatar'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token scope">Rule<span class="token punctuation">::</span></span><span class="token function">dimensions<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">maxWidth<span class="token punctuation">(</span></span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">maxHeight<span class="token punctuation">(</span></span><span class="token number">500</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">ratio<span class="token punctuation">(</span></span><span class="token number">3</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="rule-distinct"></a></p><h4>distinct</h4><p>當你在驗證數組的時候,你可以指定某個值必須是唯一的:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'foo.*.id'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'distinct'</span></code></pre><p><a name="rule-email"></a></p><h4>email</h4><p>驗證字段值是否符合 e-mail 格式。</p><p><a name="rule-exists"></a></p><h4>exists:<em>table</em>,<em>column</em></h4><p>驗證字段值是否存在指定的數據表中。</p><h4>Exists 規則的基本使用方法</h4><pre class=" language-php"><code class=" language-php"><span class="token string">'state'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'exists:states'</span></code></pre><h4>指定一個特定的字段名稱</h4><pre class=" language-php"><code class=" language-php"><span class="token string">'state'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'exists:states,abbreviation'</span></code></pre><p>有時,您可能需要指定要用于 <code class=" language-php">exists</code> 查詢的特定數據庫連接。你可以使用點「.」語法將數據庫連接名稱添加到數據表前面來實現這個目的:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'exists:connection.staff,email'</span></code></pre><p>如果您想自定義由驗證規則執行的查詢,您可以使用 <code class=" language-php">Rule</code> 類流暢地定義規則。在這個例子中,我們還將使用數組指定驗證規則,而不是使用 <code class=" language-php"><span class="token operator">|</span></code> 字符來分隔它們:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Rule</span><span class="token punctuation">;</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token scope">Rule<span class="token punctuation">::</span></span><span class="token function">exists<span class="token punctuation">(</span></span><span class="token string">'staff'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">where<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$query</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">where<span class="token punctuation">(</span></span><span class="token string">'account_id'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="rule-file"></a></p><h4>file</h4><p>必須是成功上傳的文件。</p><p><a name="rule-filled"></a></p><h4>filled</h4><p>驗證的字段必須帶有內容。</p><p><a name="rule-image"></a></p><h4>image</h4><p>驗證字段文件必須為圖片格式( jpeg、png、bmp、gif、或 svg )。</p><p><a name="rule-in"></a></p><h4>in:<em>foo</em>,<em>bar</em>,...</h4><p>驗證字段值是否有在指定的列表里面。因為這個規則通常需要你 <code class=" language-php">implode</code> 一個數組,<code class=" language-php"><span class="token scope">Rule<span class="token punctuation">::</span></span>in</code> 方法可以用來流利地構造規則:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Rule</span><span class="token punctuation">;</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'zones'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token scope">Rule<span class="token punctuation">::</span></span><span class="token function">in<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'first-zone'</span><span class="token punctuation">,</span> <span class="token string">'second-zone'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="rule-in-array"></a></p><h4>in_array:<em>anotherfield</em></h4><p>驗證的字段必須存在于 <em>anotherfield</em> 的值中。</p><p><a name="rule-integer"></a></p><h4>integer</h4><p>驗證字段值是否是整數。</p><p><a name="rule-ip"></a></p><h4>ip</h4><p>驗證字段值是否符合 IP address 的格式。</p><h4>ipv4</h4><p>驗證字段值是否符合 IPv4 的格式。</p><h4>ipv6</h4><p>驗證字段值是否符合 IPv6 的格式。</p><p><a name="rule-json"></a></p><h4>json</h4><p>驗證字段是否是一個有效的 JSON 字符串。</p><p><a name="rule-max"></a></p><h4>max:<em>value</em></h4><p>字段值必須小于或等于 <em>value</em>。字符串、數值或是文件大小的計算方式和 <a href="#rule-size"><code class=" language-php">size</code></a> 規則相同。</p><p><a name="rule-mimetypes"></a></p><h4>mimetypes:<em>text/plain</em>,...</h4><p>驗證的文件必須是這些 MIME 類型中的一個:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'video'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'mimetypes:video/avi,video/mpeg,video/quicktime'</span></code></pre><p>要確定上傳文件的MIME類型,會讀取文件的內容,并且框架將嘗試猜測 MIME 類型,這可能與客戶端提供的 MIME 類型不同。</p><p><a name="rule-mimes"></a></p><h4>mimes:<em>foo</em>,<em>bar</em>,...</h4><p>驗證字段文件的 MIME 類型是否符合列表中指定的格式。</p><h4>MIME 規則基本用法</h4><pre class=" language-php"><code class=" language-php"><span class="token string">'photo'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'mimes:jpeg,bmp,png'</span></code></pre><p>即使你可能只需要驗證指定擴展名,但此規則實際上會驗證文件的 MIME 類型,其通過讀取文件的內容以猜測它的 MIME 類型。</p><p>完整的 MIME 類型及對應的擴展名列表可以在下方鏈接找到:<a href="https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types"></a><a href="https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types">https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types</a></p><p><a name="rule-min"></a></p><h4>min:<em>value</em></h4><p>字段值必須大于或等于 <em>value</em>。字符串、數值或是文件大小的計算方式和 <a href="#rule-size"><code class=" language-php">size</code></a> 規則相同。</p><p><a name="rule-nullable"></a></p><h4>nullable</h4><p>驗證的字段可以為 <code class=" language-php"><span class="token keyword">null</span></code>。這在驗證基本數據類型,如字符串和整型這些能包含 <code class=" language-php"><span class="token keyword">null</span></code> 值的數據類型中特別有用。</p><p><a name="rule-not-in"></a></p><h4>not_in:<em>foo</em>,<em>bar</em>,...</h4><p>驗證字段值是否不在指定的列表里。</p><p><a name="rule-numeric"></a></p><h4>numeric</h4><p>驗證字段值是否為數值。</p><p><a name="rule-present"></a></p><h4>present</h4><p>驗證的字段必須出現,并且數據可以為空。</p><p><a name="rule-regex"></a></p><h4>regex:<em>pattern</em></h4><p>驗證字段值是否符合指定的正則表達式。</p><p><strong>Note:</strong> 當使用 <code class=" language-php">regex</code> 規則時,你必須使用數組,而不是使用管道分隔規則,特別是當正則表達式含有管道符號時。</p><p><a name="rule-required"></a></p><h4>required</h4><p>驗證字段必須存在輸入數據,且不為空。字段符合下方任一條件時即為「空」:</p><div class="content-list"><ul><li>該值為 <code class=" language-php"><span class="token keyword">null</span></code>.</li><li>該值為空字符串。</li><li>該值為空數組或空的 <code class=" language-php">可數</code> 對象。</li><li>該值為沒有路徑的上傳文件。</li></ul></div><p><a name="rule-required-if"></a></p><h4>required_if:<em>anotherfield</em>,<em>value</em>,...</h4><p>如果指定的其它字段( <em>anotherfield</em> )等于任何一個 <em>value</em> 時,此字段為必填。</p><p><a name="rule-required-unless"></a></p><h4>required_unless:<em>anotherfield</em>,<em>value</em>,...</h4><p>如果指定的其它字段( <em>anotherfield</em> )等于任何一個 <em>value</em> 時,此字段為不必填。</p><p><a name="rule-required-with"></a></p><h4>required_with:<em>foo</em>,<em>bar</em>,...</h4><p>如果指定的字段中的 <em>任意一個</em> 有值且不為空,則此字段為必填。</p><p><a name="rule-required-with-all"></a></p><h4>required_with_all:<em>foo</em>,<em>bar</em>,...</h4><p>如果指定的 <em>所有</em> 字段都有值,則此字段為必填。</p><p><a name="rule-required-without"></a></p><h4>required_without:<em>foo</em>,<em>bar</em>,...</h4><p>如果缺少 <em>任意一個</em> 指定的字段,則此字段為必填。</p><p><a name="rule-required-without-all"></a></p><h4>required_without_all:<em>foo</em>,<em>bar</em>,...</h4><p>如果所有指定的字段 <em>都沒有</em> 值,則此字段為必填。</p><p><a name="rule-same"></a></p><h4>same:<em>field</em></h4><p>驗證字段值和指定的 字段( <em>field</em> ) 值是否相同。</p><p><a name="rule-size"></a></p><h4>size:<em>value</em></h4><p>驗證字段值的大小是否符合指定的 <em>value</em> 值。對于字符串來說,<em>value</em> 為字符數。對于數字來說,<em>value</em> 為某個整數值。對文件來說,<em>size</em> 對應的是文件大小(單位 kb )。</p><p><a name="rule-string"></a></p><h4>string</h4><p>驗證字段值的類型是否為字符串。如果你允許字段的值為 <code class=" language-php"><span class="token keyword">null</span></code> ,那么你應該將 <code class=" language-php">nullable</code> 規則附加到字段中。</p><p><a name="rule-timezone"></a></p><h4>timezone</h4><p>驗證字段值是否是有效的時區,會根據 PHP 的 <code class=" language-php">timezone_identifiers_list</code> 函數來判斷。</p><p><a name="rule-unique"></a></p><h4>unique:<em>table</em>,<em>column</em>,<em>except</em>,<em>idColumn</em></h4><p>在指定的數據表中,驗證字段必須是唯一的。如果沒有指定 <code class=" language-php">column</code>,將會使用字段本身的名稱。</p><p><strong>指定一個特定的字段名稱:</strong></p><pre class=" language-php"><code class=" language-php"><span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'unique:users,email_address'</span></code></pre><p><strong>自定義數據庫連接</strong></p><p>有時,您可能需要為驗證程序所做的數據庫查詢設置自定義連接。如上面所示,如上所示,將 <code class=" language-php">unique:users</code> 設置為驗證規則將使用默認數據庫連接來查詢數據庫。如果要修改數據庫連接,請使用「點」語法指定連接和表名:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'unique:connection.users,email_address'</span></code></pre><p><strong>強迫 Unique 規則忽略指定 ID:</strong></p><p>有時候,你希望在進行字段唯一性驗證時對指定 ID 進行忽略。例如,在「更新個人資料」頁面會包含用戶名、郵箱等字段。這時你會想要驗證更新的 E-mail 值是否為唯一的。如果用戶僅更改了名稱字段而沒有改 E-mail 字段,就不需要拋出驗證錯誤,因為此用戶已經是這個 E-mail 的擁有者了。若要用指定規則來忽略用戶 ID,則應該把要發送的 ID 當作第三個參數:</p><p>為了指示驗證器忽略用戶的ID,我們將使用 <code class=" language-php">Rule</code> 類流暢地定義規則。 在這個例子中,我們還將通過數組來指定驗證規則,而不是使用 <code class=" language-php"><span class="token operator">|</span></code> 字符來分隔:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Validation<span class="token punctuation">\</span>Rule</span><span class="token punctuation">;</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'required'</span><span class="token punctuation">,</span>
<span class="token scope">Rule<span class="token punctuation">::</span></span><span class="token function">unique<span class="token punctuation">(</span></span><span class="token string">'users'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">ignore<span class="token punctuation">(</span></span><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>如果你的數據表使用的主鍵名稱不是 <code class=" language-php">id</code>,則可以在調用 <code class=" language-php">ignore</code> 方法時指定列的名稱:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token scope">Rule<span class="token punctuation">::</span></span><span class="token function">unique<span class="token punctuation">(</span></span><span class="token string">'users'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">ignore<span class="token punctuation">(</span></span><span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">,</span> <span class="token string">'user_id'</span><span class="token punctuation">)</span></code></pre><p><strong>增加額外的 Where 語句:</strong></p><p>你也可以通過 <code class=" language-php">where</code> 方法指定額外的查詢約束條件。例如,我們添加 <code class=" language-php">account_id</code> 為 <code class=" language-php"><span class="token number">1</span></code> 約束條件:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token scope">Rule<span class="token punctuation">::</span></span><span class="token function">unique<span class="token punctuation">(</span></span><span class="token string">'users'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">where<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$query</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">where<span class="token punctuation">(</span></span><span class="token string">'account_id'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><p><a name="rule-url"></a></p><h4>url</h4><p>驗證字段必需是有效的 URL 格式。</p><p><a name="conditionally-adding-rules"></a></p><h2><a href="#conditionally-adding-rules">按條件增加規則</a></h2><h4>當字段存在的時候進行驗證</h4><p>在某些情況下,你可能 <strong>只想</strong> 在輸入數據中有此字段時才進行驗證。可通過增加 <code class=" language-php">sometimes</code> 規則到規則列表來實現:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$v</span> <span class="token operator">=</span> <span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'sometimes|required|email'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>在上面的例子中,<code class=" language-php">email</code> 字段的驗證只會在 <code class=" language-php"><span class="token variable">$data</span></code> 數組有此字段時才會進行。</p><h4>復雜的條件驗證</h4><p>有時候你可能希望增加更復雜的驗證條件,例如,你可以希望某個指定字段在另一個字段的值超過 100 時才為必填。或者當某個指定字段有值時,另外兩個字段要擁有符合的特定值。增加這樣的驗證條件并不難。首先,利用你熟悉的 <em>static rules</em> 來創建一個 <code class=" language-php">Validator</code> 實例:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$v</span> <span class="token operator">=</span> <span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|email'</span><span class="token punctuation">,</span>
<span class="token string">'games'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required|numeric'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>假設我們有一個專為游戲收藏家所設計的網頁應用程序。如果游戲收藏家收藏超過一百款游戲,我們會希望他們來說明下為什么他們會擁有這么多游戲。比如說他們有可能經營了一家二手游戲商店,或者只是為了享受收集的樂趣。為了在特定條件下加入此驗證需求,可以在 <code class=" language-php">Validator</code> 實例中使用 <code class=" language-php">sometimes</code> 方法。</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$v</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">sometimes<span class="token punctuation">(</span></span><span class="token string">'reason'</span><span class="token punctuation">,</span> <span class="token string">'required|max:500'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$input</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">games</span> <span class="token operator">>=</span> <span class="token number">100</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>傳入 <code class=" language-php">sometimes</code> 方法的第一個參數是我們要用條件認證的字段名稱。第二個參數是我們想使用的驗證規則。<code class=" language-php">閉包</code> 作為第三個參數傳入,如果其返回 <code class=" language-php"><span class="token boolean">true</span></code>,則額外的規則就會被加入。這個方法可以輕松的創建復雜的條件式驗證。你甚至可以一次對多個字段增加條件式驗證:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$v</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">sometimes<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'reason'</span><span class="token punctuation">,</span> <span class="token string">'cost'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'required'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$input</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">games</span> <span class="token operator">>=</span> <span class="token number">100</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 傳入 <code class=" language-php">閉包</code> 的 <code class=" language-php"><span class="token variable">$input</span></code> 參數是 <code class=" language-php">Illuminate\<span class="token package">Support<span class="token punctuation">\</span>Fluent</span></code> 實例,可用來訪問你的輸入或文件對象。</p></blockquote><p><a name="validating-arrays"></a></p><h2><a href="#validating-arrays">驗證數組</a></h2><p>驗證基于數組的表單輸入字段并不一定是一件痛苦的事情。要驗證指定數組輸入字段中的每一個 email 是否唯一,可以這么做:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$validator</span> <span class="token operator">=</span> <span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">all<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'person.*.email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'email|unique:users'</span><span class="token punctuation">,</span>
<span class="token string">'person.*.first_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'required_with:person.*.last_name'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>同理,你在語言文件定義驗證信息的時候可以使用星號 <code class=" language-php"><span class="token operator">*</span></code> 字符,可以更加容易的在基于數組格式的字段中使用相同的驗證信息:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'custom'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'person.*.email'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'unique'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Each person must have a unique e-mail address'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p><a name="custom-validation-rules"></a></p><h2><a href="#custom-validation-rules">自定義驗證規則</a></h2><p>Laravel 提供了許多有用的驗證規則。但你可能想自定義一些規則。注冊自定義驗證規則的方法之一,就是使用 <code class=" language-php">Validator</code> <a href="/docs/5.4/facades">Facade</a> 中的 <code class=" language-php">extend</code> 方法,讓我們在 <a href="/docs/5.4/providers">服務提供者</a> 中使用這個方法來注冊自定義的驗證規則:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Providers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>ServiceProvider</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Validator</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">AppServiceProvider</span> <span class="token keyword">extends</span> <span class="token class-name">ServiceProvider</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* 啟動任意應用程序服務。
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">boot<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">extend<span class="token punctuation">(</span></span><span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$attribute</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$parameters</span><span class="token punctuation">,</span> <span class="token variable">$validator</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$value</span> <span class="token operator">==</span> <span class="token string">'foo'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">/**
* 注冊服務容器。
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">register<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>自定義的驗證閉包接收四個參數:要被驗證的屬性名稱 <code class=" language-php"><span class="token variable">$attribute</span></code>,屬性的值 <code class=" language-php"><span class="token variable">$value</span></code>,傳入驗證規則的參數數組 <code class=" language-php"><span class="token variable">$parameters</span></code>,及 <code class=" language-php">Validator</code> 實例。</p><p>除了使用閉包,你也可以傳入類和方法到 <code class=" language-php">extend</code> 方法中:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">extend<span class="token punctuation">(</span></span><span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token string">'FooValidator@validate'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>自定義錯誤消息</h4><p>另外你可能還需要為自定義規則來定義一個錯誤消息。這可以通過使用自定義內聯消息數組或是在驗證語言包中加入新的規則來實現。此消息應該被放在數組的第一級,而不是被放在 <code class=" language-php">custom</code> 數組內,這是僅針對特定屬性的錯誤消息:</p><pre class=" language-php"><code class=" language-php"><span class="token string">"foo"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"你的輸入是無效的!"</span><span class="token punctuation">,</span>
<span class="token string">"accepted"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">":attribute 必須被接受。"</span><span class="token punctuation">,</span>
<span class="token comment" spellcheck="true">
// 其余的驗證錯誤消息...</span></code></pre><p>當你在創建自定義驗證規則時,你可能需要定義占位符來取代錯誤消息。你可以像上面所描述的那樣通過 <code class=" language-php">Validator</code> Facade 來使用 <code class=" language-php">replacer</code> 方法創建一個自定義驗證器。通過 <a href="/docs/5.4/providers">服務提供者</a> 中的 <code class=" language-php">boot</code> 方法可以實現:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 啟動任意應用程序服務。
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">boot<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">extend<span class="token punctuation">(</span></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">replacer<span class="token punctuation">(</span></span><span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">,</span> <span class="token variable">$attribute</span><span class="token punctuation">,</span> <span class="token variable">$rule</span><span class="token punctuation">,</span> <span class="token variable">$parameters</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">str_replace<span class="token punctuation">(</span></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>隱式擴展功能</h4><p>默認情況下,若有一個類似 <a href="#rule-required"><code class=" language-php">required</code></a> 這樣的規則,當此規則被驗證的屬性不存在或包含空值時,其一般的驗證規則(包括自定擴展功能)都將不會被運行。例如,當 integer 規則的值為 null 時 <a href="#rule-unique"><code class=" language-php">unique</code></a> 將不會被運行:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$rules</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'unique'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token variable">$input</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">null</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">make<span class="token punctuation">(</span></span><span class="token variable">$input</span><span class="token punctuation">,</span> <span class="token variable">$rules</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">passes<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true"> // true</span></code></pre><p>如果要在屬性為空時依然運行此規則,則此規則必須暗示該屬性為必填。要創建一個「隱式」擴展功能,可以使用 <code class=" language-php"><span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">extendImplicit<span class="token punctuation">(</span></span><span class="token punctuation">)</span></code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Validator<span class="token punctuation">::</span></span><span class="token function">extendImplicit<span class="token punctuation">(</span></span><span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$attribute</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$parameters</span><span class="token punctuation">,</span> <span class="token variable">$validator</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$value</span> <span class="token operator">==</span> <span class="token string">'foo'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon note"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="90px" height="90px" viewBox="0 0 90 90" enable-background="new 0 0 90 90" xml:space="preserve"><path fill="#FFFFFF" d="M45 0C20.1 0 0 20.1 0 45s20.1 45 45 45 45-20.1 45-45S69.9 0 45 0zM45 74.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5 6.5 2.9 6.5 6.5S48.6 74.5 45 74.5zM52.1 23.9l-2.5 29.6c0 2.5-2.1 4.6-4.6 4.6 -2.5 0-4.6-2.1-4.6-4.6l-2.5-29.6c-0.1-0.4-0.1-0.7-0.1-1.1 0-4 3.2-7.2 7.2-7.2 4 0 7.2 3.2 7.2 7.2C52.2 23.1 52.2 23.5 52.1 23.9z"></path></svg></span></div> 一個「隱式」擴展功能只會 暗示 該屬性為必填。它的實際屬性是否為無效屬性或空屬性主要取決于你。</p></blockquote><h2>譯者署名</h2><table><thead><tr><th>用戶名</th><th>頭像</th><th>職能</th><th>簽名</th></tr></thead><tbody><tr><td><a href="http://weibo.com/wangkaibo">@王凱波</a></td><td><img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/1924_1487053084.jpeg?imageView2/1/w/100/h/100"></td><td>翻譯</td><td>面向工資編程 ?? <a href="https://github.com/wangkaibo/">@wangkaibo</a></td></tr></tbody></table></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度