<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                <article><h1>Laravel 的 HTTP 控制器</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#basic-controllers">基礎控制器</a><ul><li><a href="#defining-controllers">定義控制器</a></li><li><a href="#controllers-and-namespaces">控制器與命名空間</a></li><li><a href="#single-action-controllers">單一操作控制器</a></li></ul></li><li><a href="#controller-middleware">控制器中間件</a></li><li><a href="#resource-controllers">資源控制器</a><ul><li><a href="#restful-partial-resource-routes">部分資源路由</a></li><li><a href="#restful-naming-resource-routes">命名資源路由</a></li><li><a href="#restful-naming-resource-route-parameters">命名資源路由參數</a></li><li><a href="#restful-localizing-resource-uris">本地化資源 URI</a></li><li><a href="#restful-supplementing-resource-controllers">附加資源控制器</a></li></ul></li><li><a href="#dependency-injection-and-controllers">依賴注入與控制器</a></li><li><a href="#route-caching">路由緩存</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><p>除了在路由文件中以閉包的形式定義所有的請求處理邏輯外,你可能還想使用控制器類來組織此類操作。控制器能夠將相關的請求處理邏輯組成一個單獨的類。控制器被存放在 <code class=" language-php">app<span class="token operator">/</span>Http<span class="token operator">/</span>Controllers</code> 目錄下。</p><p><a name="basic-controllers"></a></p><h2><a href="#basic-controllers">基礎控制器</a></h2><p><a name="defining-controllers"></a></p><h3>定義控制器</h3><p>以下是一個基礎控制器類的例子。需要注意的是,該控制器繼承了 Laravel 內置的基礎控制器類。該基礎類提供了一些便捷的方法,比如 <code class=" language-php">middleware</code> 方法,該方法可以用來給控制器操作添加中間件:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter">&lt;?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">App<span class="token punctuation">\</span>User</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">UserController</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 int $id * @return Response */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">show<span class="token punctuation">(</span></span><span class="token variable">$id</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">'user.profile'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'user'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token scope">User<span class="token punctuation">::</span></span><span class="token function">findOrFail<span class="token punctuation">(</span></span><span class="token variable">$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></code></pre><p>你可以這樣定義一個指向該控制器操作的路由:</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">'user/{id}'</span><span class="token punctuation">,</span> <span class="token string">'UserController@show'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>現在,當請求和此特定路由的 URI 匹配時,<code class=" language-php">UserController</code> 類的 <code class=" language-php">show</code> 方法就會被執行。當然,路由參數也會被傳遞至該方法。</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> 控制器并不是 <strong>一定</strong> 要繼承基礎類。只是,你將無法使用一些便捷的功能,比如 <code class=" language-php">middleware</code>,<code class=" language-php">validate</code> 和 <code class=" language-php">dispatch</code> 方法。</p></blockquote><p><a name="controllers-and-namespaces"></a></p><h3>控制器與命名空間</h3><p>這一點很重要,我們在定義控制器路由時,不必指定完整的控制器命名空間。<code class=" language-php">RouteServiceProvider</code> 會在一個包含命名空間的路由組中加載路由文件,因此我們只需要指定類名中 <code class=" language-php">App\<span class="token package">Http<span class="token punctuation">\</span>Controllers</span></code> 命名空間之后的部分就可以了。</p><p>如果你選擇將控制器存放在 <code class=" language-php">App\<span class="token package">Http<span class="token punctuation">\</span>Controllers</span></code> 目錄下,只需簡單地使用相對于根命名空間 <code class=" language-php">App\<span class="token package">Http<span class="token punctuation">\</span>Controllers</span></code> 的特定類名。因此,如果你的完整控制器類是 <code class=" language-php">App\<span class="token package">Http<span class="token punctuation">\</span>Controllers<span class="token punctuation">\</span>Photos<span class="token punctuation">\</span>AdminController</span></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">'foo'</span><span class="token punctuation">,</span> <span class="token string">'Photos\AdminController@method'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="single-action-controllers"></a></p><h3>單一操作控制器</h3><p>如果想定義一個只處理單個操作的控制器,你可以在控制器中只設置一個 <code class=" language-php">__invoke</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter">&lt;?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">App<span class="token punctuation">\</span>User</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">ShowProfile</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 int $id * @return Response */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__invoke<span class="token punctuation">(</span></span><span class="token variable">$id</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">'user.profile'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'user'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token scope">User<span class="token punctuation">::</span></span><span class="token function">findOrFail<span class="token punctuation">(</span></span><span class="token variable">$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></code></pre><p>為單一操作控制器注冊路由時,無需指定方法:</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">'user/{id}'</span><span class="token punctuation">,</span> <span class="token string">'ShowProfile'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="controller-middleware"></a></p><h2><a href="#controller-middleware">控制器中間件</a></h2><p><a href="/docs/5.4/middleware">中間件</a> 可以在路由文件中指定給控制器路由:</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">'profile'</span><span class="token punctuation">,</span> <span class="token string">'UserController@show'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">middleware<span class="token punctuation">(</span></span><span class="token string">'auth'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>然而,在控制器的構造方法中指定中間件會更為便捷。在控制器構造方法中使用 <code class=" language-php">middleware</code> 方法,你可以很容易地將中間件指定給控制器操作。你甚至可以約束中間件只對控制器類中的某個特定方法生效:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">class</span> <span class="token class-name">UserController</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 void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct<span class="token punctuation">(</span></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">&gt;</span><span class="token function">middleware<span class="token punctuation">(</span></span><span class="token string">'auth'</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">&gt;</span><span class="token function">middleware<span class="token punctuation">(</span></span><span class="token string">'log'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">only<span class="token punctuation">(</span></span><span class="token string">'index'</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">&gt;</span><span class="token function">middleware<span class="token punctuation">(</span></span><span class="token string">'subscribed'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">except<span class="token punctuation">(</span></span><span class="token string">'store'</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 this">$this</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">middleware<span class="token punctuation">(</span></span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true"> // ... </span> <span class="token keyword">return</span> <span class="token variable">$next</span><span class="token punctuation">(</span><span class="token variable">$request</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><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> 你可能將中間件指定到控制器的部分操作上,然而,這會使你的控制器過于臃腫。換個角度,考慮將控制器分成多個更小的控制器。</p></blockquote><p><a name="resource-controllers"></a></p><h2><a href="#resource-controllers">資源控制器</a></h2><p>Laravel 資源路由可以將典型的「CURD」路由指定到一個控制器上,僅需一行代碼就可以實現。比如,你可能希望創建一個控制器來處理所有應用保存的「相片」的 HTTP 請求。使用 Artisan 命令 <code class=" language-php">make<span class="token punctuation">:</span>controller</code>,就能快速創建這樣一個控制器:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>controller PhotoController <span class="token operator">--</span>resource</code></pre><p>這個命令會在 <code class=" language-php">app<span class="token operator">/</span>Http<span class="token operator">/</span>Controllers<span class="token operator">/</span>PhotoController<span class="token punctuation">.</span>php</code> 中生成一個控制器,該控制器包含了各種可用的資源操作方法。</p><p>接下來,你可以給控制器注冊一個資源路由:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">resource<span class="token punctuation">(</span></span><span class="token string">'photos'</span><span class="token punctuation">,</span> <span class="token string">'PhotoController'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>這個路由聲明會創建多個路由來處理各種各樣的資源操作。前面生成的控制器已經包含了這些操作的方法,還包括了 HTTP 動作和操作 URI 的注釋。</p><h4>資源控制器操作處理</h4><table><thead><tr><th>動作</th><th>URI</th><th>操作</th><th>路由名稱</th></tr></thead><tbody><tr><td>GET</td><td><code class=" language-php"><span class="token operator">/</span>photos</code></td><td>index</td><td>photos.index</td></tr><tr><td>GET</td><td><code class=" language-php"><span class="token operator">/</span>photos<span class="token operator">/</span>create</code></td><td>create</td><td>photos.create</td></tr><tr><td>POST</td><td><code class=" language-php"><span class="token operator">/</span>photos</code></td><td>store</td><td>photos.store</td></tr><tr><td>GET</td><td><code class=" language-php"><span class="token operator">/</span>photos<span class="token operator">/</span><span class="token punctuation">{</span>photo<span class="token punctuation">}</span></code></td><td>show</td><td>photos.show</td></tr><tr><td>GET</td><td><code class=" language-php"><span class="token operator">/</span>photos<span class="token operator">/</span><span class="token punctuation">{</span>photo<span class="token punctuation">}</span><span class="token operator">/</span>edit</code></td><td>edit</td><td>photos.edit</td></tr><tr><td>PUT/PATCH</td><td><code class=" language-php"><span class="token operator">/</span>photos<span class="token operator">/</span><span class="token punctuation">{</span>photo<span class="token punctuation">}</span></code></td><td>update</td><td>photos.update</td></tr><tr><td>DELETE</td><td><code class=" language-php"><span class="token operator">/</span>photos<span class="token operator">/</span><span class="token punctuation">{</span>photo<span class="token punctuation">}</span></code></td><td>destroy</td><td>photos.destroy</td></tr></tbody></table><h4>指定資源模型</h4><p>如果你使用了路由模型綁定,并且想在資源控制器的方法中對某個模型實例做類型約束,你可以在生成控制器的時候使用 <code class=" language-php"><span class="token operator">--</span>model</code> 選項:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>controller PhotoController <span class="token operator">--</span>resource <span class="token operator">--</span>model<span class="token operator">=</span>Photo</code></pre><h4>偽造表單方法</h4><p>送 <code class=" language-php"><span class="token constant">PUT</span></code>,<code class=" language-php"><span class="token constant">PATCH</span></code> 或者 <code class=" language-php"><span class="token constant">DELETE</span></code> 請求,你需要添加一個 <code class=" language-php">_method</code> 隱藏域字段來偽造 HTTP 動作。<code class=" language-php">method_field</code> 輔助函數可以為你創建這個字段:</p><pre class=" language-php"><code class=" language-php"><span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token function">method_field<span class="token punctuation">(</span></span><span class="token string">'PUT'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><a name="restful-partial-resource-routes"></a></p><h3>部分資源路由</h3><p>聲明資源路由的時候,你可以指定控制器處理部分操作,而不必使用全部默認的操作:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">resource<span class="token punctuation">(</span></span><span class="token string">'photo'</span><span class="token punctuation">,</span> <span class="token string">'PhotoController'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'only'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token punctuation">[</span> <span class="token string">'index'</span><span class="token punctuation">,</span> <span class="token string">'show'</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">Route<span class="token punctuation">::</span></span><span class="token function">resource<span class="token punctuation">(</span></span><span class="token string">'photo'</span><span class="token punctuation">,</span> <span class="token string">'PhotoController'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'except'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token punctuation">[</span> <span class="token string">'create'</span><span class="token punctuation">,</span> <span class="token string">'store'</span><span class="token punctuation">,</span> <span class="token string">'update'</span><span class="token punctuation">,</span> <span class="token string">'destroy'</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="restful-naming-resource-routes"></a></p><h3>命名資源路由</h3><p>默認地,所有的資源路由操作都有一個路由名稱;不過你可以在參數選項中傳入一個 <code class=" language-php">names</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">resource<span class="token punctuation">(</span></span><span class="token string">'photo'</span><span class="token punctuation">,</span> <span class="token string">'PhotoController'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'names'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token punctuation">[</span> <span class="token string">'create'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token string">'photo.build'</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="restful-naming-resource-route-parameters"></a></p><h3>命名資源路由參數</h3><p>默認地,<code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span>resource</code> 會基于資源名稱的「單數」形式生成路由參數。你可以在選項數組中傳入 <code class=" language-php">parameters</code> 參數,實現每個資源基礎中參數名稱的重寫。<code class=" language-php">parameters</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">resource<span class="token punctuation">(</span></span><span class="token string">'user'</span><span class="token punctuation">,</span> <span class="token string">'AdminUserController'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'parameters'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token punctuation">[</span> <span class="token string">'user'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token string">'admin_user'</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">show</code> 方法的路由生成如下的 URI:</p><pre class=" language-php"><code class=" language-php"><span class="token operator">/</span>user<span class="token operator">/</span><span class="token punctuation">{</span>admin_user<span class="token punctuation">}</span></code></pre><p><a name="restful-localizing-resource-uris"></a></p><h3>本地化資源 URI</h3><p>默認地,<code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span>resource</code> 將會用英文動詞創建資源 URI。如果你想本地化 <code class=" language-php">create</code> 和 <code class=" language-php">edit</code> 的動作名,可以使用 <code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span>resourceVerb</code> 方法,可以在 <code class=" language-php">AppServiceProvider</code> 的 <code class=" language-php">boot</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>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Route</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">Route<span class="token punctuation">::</span></span><span class="token function">resourceVerbs<span class="token punctuation">(</span></span><span class="token punctuation">[</span> <span class="token string">'create'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token string">'crear'</span><span class="token punctuation">,</span> <span class="token string">'edit'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token string">'editar'</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"><span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">resource<span class="token punctuation">(</span></span><span class="token string">'fotos'</span><span class="token punctuation">,</span> <span class="token string">'PhtotController'</span><span class="token punctuation">)</span></code> 這樣注冊的資源路由將會產生如下的 URI:</p><pre class=" language-php"><code class=" language-php"><span class="token operator">/</span>fotos<span class="token operator">/</span>crear <span class="token operator">/</span>fotos<span class="token operator">/</span><span class="token punctuation">{</span>foto<span class="token punctuation">}</span><span class="token operator">/</span>editar</code></pre><p><a name="restful-supplementing-resource-controllers"></a></p><h3>附加資源控制器</h3><p>如果你想在默認的資源路由之外增加資源控制器路由,你應該在調用 <code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span>resource</code> 之前定義這些路由;否則,<code class=" language-php">resource</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">'photos/popular'</span><span class="token punctuation">,</span> <span class="token string">'PhotoController@method'</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">resource<span class="token punctuation">(</span></span><span class="token string">'photos'</span><span class="token punctuation">,</span> <span class="token string">'PhotoController'</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> 記住保持控制器的專一性。如果你需要典型的資源操作之外的方法,考慮將你的控制器分成兩個更小的控制器吧。</p></blockquote><p><a name="dependency-injection-and-controllers"></a></p><h2><a href="#dependency-injection-and-controllers">依賴注入與控制器</a></h2><h4>構造方法注入</h4><p>Laravel 使用 <a href="/docs/5.4/container">服務容器</a> 來解析所有的控制器。因此,你可以在控制器的構造方法中對任何依賴使用類型約束,聲明的依賴會自動被解析并注入控制器實例中:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter">&lt;?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">App<span class="token punctuation">\</span>Repositories<span class="token punctuation">\</span>UserRepository</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">UserController</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">/** * 用戶 repository 實例。 */</span> <span class="token keyword">protected</span> <span class="token variable">$users</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">/** * 創建一個新的控制器實例。 * * @param UserRepository $users * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct<span class="token punctuation">(</span></span>UserRepository <span class="token variable">$users</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">&gt;</span><span class="token property">users</span> <span class="token operator">=</span> <span class="token variable">$users</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><p>當然,你也可以對任何的 <a href="/docs/5.4/contracts">Laravel contract</a> 使用類型約束。當容器解析 contract 的時候,就會使用類型約束。直接將依賴注入控制器可能會提供更好的可測試性,但這取決于你的項目的具體情況。</p><h4>方法注入</h4><p>除了構造方法注入之外,你還可以在控制器方法中使用依賴類型約束。一個常見的用法就是將 <code class=" language-php">Illuminate\<span class="token package">Http<span class="token punctuation">\</span>Request</span></code> 實例注入控制器方法中:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter">&lt;?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">class</span> <span class="token class-name">UserController</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">$name</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">name</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>如果控制器方法需要從路由參數中獲取輸入內容,只需在其他依賴后列出路由參數即可。比如,路由定義如下:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Route<span class="token punctuation">::</span></span><span class="token function">put<span class="token punctuation">(</span></span><span class="token string">'user/{id}'</span><span class="token punctuation">,</span> <span class="token string">'UserController@update'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>通過以下方式定義控制器方法,可以讓你在使用 <code class=" language-php">Illuminate\<span class="token package">Http<span class="token punctuation">\</span>Request</span></code> 類型約束的同時仍然可以獲取參數 <code class=" language-php">id</code>:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter">&lt;?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">class</span> <span class="token class-name">UserController</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 * @param string $id * @return Response */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">update<span class="token punctuation">(</span></span>Request <span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$id</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="route-caching"></a></p><h2><a href="#route-caching">路由緩存</a></h2><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><p>如果你的應用只用到了基于控制器的路由,那么你應該充分利用 Laravel 的路由緩存。使用路由緩存將極大地減少注冊全部應用路由的時間。某些情況下,路由注冊甚至可以快一百倍。要生成路由緩存,只需在 Artisan 命令行中執行 <code class=" language-php">route<span class="token punctuation">:</span>cache</code> 命令:</p><pre class=" language-php"><code class=" language-php">php artisan route<span class="token punctuation">:</span>cache</code></pre><p>運行這個命令之后,每一次請求的時候都將會加載緩存的路由文件。記住,如果添加了新的路由,你需要刷新路由緩存。因此,你應該只在項目部署時才運行 <code class=" language-php">route<span class="token punctuation">:</span>cache</code> 命令:</p><p>你可以使用 <code class=" language-php">route<span class="token punctuation">:</span>clear</code> 命令清除路由緩存:</p><pre class=" language-php"><code class=" language-php">php artisan route<span class="token punctuation">:</span>clear</code></pre><h2>譯者署名</h2><table><thead><tr><th>用戶名</th><th>頭像</th><th>職能</th><th>簽名</th></tr></thead><tbody><tr><td><a href="https://github.com/Romeo0906">@Romeo</a></td><td><img class="avatar-66 rm-style" src="https://avatars1.githubusercontent.com/u/22153498?v=3&amp;s=460"></td><td>翻譯</td><td>No bug, no gain.</td></tr></tbody></table></article>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看