<article><h1>服務提供者</h1><ul><li><a href="#introduction">簡介</a></li><li><a href="#writing-service-providers">編寫服務提供者</a><ul><li><a href="#the-register-method">注冊方法</a></li><li><a href="#the-boot-method">引導方法</a></li></ul></li><li><a href="#registering-providers">注冊提供者</a></li><li><a href="#deferred-providers">延遲的提供者</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><p>服務提供者是所有 Laravel 應用程序引導啟動的中心所在。包括您自己的應用程序,以及所有的 Laravel 核心服務,都是通過服務提供者引導啟動的。</p><p>但我們所謂的「引導啟動」指的是什么?一般而言,我們指的是<strong>注冊</strong>事務,包括注冊服務容器綁定,事件監聽器,中間件,甚至路由。服務提供者是配置應用程序的中心所在。</p><p>如果您打開 Laravel 的 <code class=" language-php">config<span class="token operator">/</span>app<span class="token punctuation">.</span>php</code> 文件,您會看到一個 <code class=" language-php">providers</code> 數組。這些是將被應用程序加載的服務提供者類。當然,它們其中有許多是「延遲」提供者,意味著它們不會每次請求都加載,只會按需加載。</p><p>在本概述中,您將學習如何編寫自己的服務提供商,并在您的 Laravel 應用程序中注冊它們。</p><p><a name="writing-service-providers"></a></p><h2><a href="#writing-service-providers">編寫服務提供者</a></h2><p>所有服務提供者都需要繼承 <code class=" language-php">Illuminate\<span class="token package">Support<span class="token punctuation">\</span>ServiceProvider</span></code> 類。大多數服務提供者都包含 <code class=" language-php">register</code> 和 <code class=" language-php">boot</code> 方法。在 <code class=" language-php">register</code> 方法中,您應該<strong>只能將事務綁定到 <a href="/docs/5.4/container">服務容器</a></strong>。不應該在 <code class=" language-php">register</code> 方法中嘗試注冊任何事件監聽器,路由或者任何其他功能。</p><p>Artisan 命令行可以生成一個新的提供者通過 <code class=" language-php">make<span class="token punctuation">:</span>provider</code> 命令:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>provider RiakServiceProvider</code></pre><p><a name="the-register-method"></a></p><h3>注冊方法</h3><p>如前所述,在 <code class=" language-php">register</code> 方法中,您只能將事務綁定到 <a href="/docs/5.4/container">服務容器</a> 。不應該在 <code class=" language-php">register</code> 方法中嘗試注冊任何事件監聽器,路由或者任何其他功能。否則,您可能會意外的使用到尚未加載的服務提供者提供的服務。</p><p>讓我們來看看一個基本的服務提供者。在服務提供者的方法中,都會提供一個有服務容器訪問權限的 <code class=" language-php"><span class="token variable">$app</span></code> 屬性:</p><p>現在,讓我們來看看基本的服務提供者。在你的任意一個服務提供者方法中,你總是可以通過訪問 <code class=" language-php"><span class="token variable">$app</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>Providers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Riak<span class="token punctuation">\</span>Connection</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">class</span> <span class="token class-name">RiakServiceProvider</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">register<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">></span><span class="token property">app</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">singleton<span class="token punctuation">(</span></span><span class="token scope">Connection<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$app</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Connection</span><span class="token punctuation">(</span><span class="token function">config<span class="token punctuation">(</span></span><span class="token string">'riak'</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>服務提供者只定義了一個 <code class=" language-php">register</code> 方法,并且使用該方法在服務容器中定義了一個 <code class=" language-php">Riak\<span class="token package">Connection</span></code> 類的實現。如果您不明白服務容器的工作原理,請查看 <a href="/docs/5.4/container">服務容器</a>。</p><p><a name="the-boot-method"></a></p><h3>引導方法</h3><p>那么,如果我們需要在我們的服務提供商中注冊一個視圖合成器呢?這應該在 <code class=" language-php">boot</code> 方法中完成。<strong>此方法在所有其他服務提供者均已注冊之后調用</strong>,這意味著您可以訪問已由框架注冊的所有服務:</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">class</span> <span class="token class-name">ComposerServiceProvider</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 function">view<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">composer<span class="token punctuation">(</span></span><span class="token string">'view'</span><span class="token punctuation">,</span> <span class="token keyword">function</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><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><h4>引導方法依賴注入</h4><p>您可以為服務提供者的 <code class=" language-php">boot</code> 方法設置類型提示。<a href="/docs/5.4/container">服務容器</a> 會自動注入您需要的任何依賴:</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>Contracts<span class="token punctuation">\</span>Routing<span class="token punctuation">\</span>ResponseFactory</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">boot<span class="token punctuation">(</span></span>ResponseFactory <span class="token variable">$response</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$response</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">macro<span class="token punctuation">(</span></span><span class="token string">'caps'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$value</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><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="registering-providers"></a></p><h2><a href="#registering-providers">注冊提供者</a></h2><p>所有服務提供者都在 <code class=" language-php">config<span class="token operator">/</span>app<span class="token punctuation">.</span>php</code> 配置文件中注冊。此文件包含一個服務提供者類數組 <code class=" language-php">providers</code> 。默認情況下,它只會列出 Laravel 核心服務提供者類。這些服務提供者引導啟動 Laravel 核心組件,例如郵件程序,隊列,緩存和其他。</p><p>要注冊您的提供程序,只需將其添加到數組:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'providers'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token comment" spellcheck="true"> // Other Service Providers
</span>
<span class="token scope">App<span class="token punctuation">\</span>Providers<span class="token punctuation">\</span>ComposerServiceProvider<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p><a name="deferred-providers"></a></p><h2><a href="#deferred-providers">延遲的提供者</a></h2><p>如果您的提供程序 <strong>僅</strong> 在 <a href="/docs/5.4/container">服務容器</a> 中注冊綁定,您可以選擇推遲其注冊,直到真正需要注冊綁定時。延遲加載服務提供者將提高應用程序的性能,因為它不會每次都從文件系統中加載。</p><p>Laravel 編譯并保存了一份清單,包括由延緩服務提供者所提供的所有服務,以及其服務提供者類的類名。因此,只有在當您在試圖解析其中的服務時,Laravel 才會加載該服務提供者。</p><p>若要推遲提供者的加載,請將 <code class=" language-php">defer</code> 屬性設置為 <code class=" language-php"><span class="token boolean">true</span></code> ,并定義 <code class=" language-php">provides</code> 方法。<code class=" language-php">provides</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>Providers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Riak<span class="token punctuation">\</span>Connection</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">class</span> <span class="token class-name">RiakServiceProvider</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">/**
* 顯示是否延遲提供程序的加載
*
* @var bool
*/</span>
<span class="token keyword">protected</span> <span class="token variable">$defer</span> <span class="token operator">=</span> <span class="token boolean">true</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 this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">app</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">singleton<span class="token punctuation">(</span></span><span class="token scope">Connection<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$app</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Connection</span><span class="token punctuation">(</span><span class="token variable">$app</span><span class="token punctuation">[</span><span class="token string">'config'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'riak'</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 comment" spellcheck="true">/**
* 獲取提供者提供的服務
*
* @return array
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">provides<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 scope">Connection<span class="token punctuation">::</span></span><span class="token keyword">class</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></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/e421083458">@e421083458</a></td><td><img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/10802_1486368142.jpeg?imageView2/1/w/100/h/100"></td><td>翻譯</td><td>Github求star,<a href="https://github.com/e421083458/">@e421083458</a> at Github</td></tr></tbody></table></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度