laravel 基礎教程 —— 包開發

包開發

包是在 laravel 中添加功能的主要方式。包可以是任何形式,比如處理日期的 Carbon 或者是整個 BDD 測試框架 Behat

當然,包是有不同類型的。有些包是獨立的包。意味著它可以在任何框架中使用,而不僅僅是在 laravel 中。Carbon 和 Behat 就是獨立的包。這些包你可以簡單的通過在 composer.json 文件中進行引入安裝使用。

而在另一方面,有些包是專門用于 laravel 使用的。這些包可能擁有路由,控制器,視圖和配置文件,他們配合起來旨在提高 laravel 的功能。這篇指南就是來告訴你如何開發增強 laravel 功能的包。

服務提供者

服務提供者是 laravel 和包的連接點。服務提供者主要負責包內容在服務容器中的綁定以及應用應該如何加載資源文件如視圖,配置文件和語言文件。

一個服務提供者應該繼承 Illuminate\Support\ServiceProvider 類并且包含兩個方法: registerboot。基類 ServiceProvider 類位于 Composer 包的 illuminate/support 中。你應該在你的包中添加這個依賴。

路由

你可以在你的服務提供者的 boot 方法中簡單的 require 路由文件來定義包的路由。在你的路由文件中,你可以使用 Route 假面來注冊路由,其方式就如普通的 laravel 應用一樣:

/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   if (! $this->app->routesAreCached(){
     requir __DIR__.'/../../routes.php';
   })
 }

資源

視圖

你需要告訴 laravel 視圖的位置才能使 laravel 加載包中的視圖。你可以通過服務提供者的 loadViewsFrom 方法。loadViewsFrom 方法接受兩個參數:視圖的路徑和包的名稱。比如,如果你的包名稱是“courier”,你應該像下面一樣在 boot 中添加:

/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');
 }

包視圖的使用方式是通過 package::view 類似的語法引用的。所以,你可以像這樣從 courier 包中引入 admin 視圖:

Route::get('admin', function () {
  return view('courier::admin'); 
});

覆蓋包視圖

當你使用 loadViewsFrom 方法來加載視圖時,laravel 實際上是注冊了兩個視圖位置:一個是應用的 resources/views/vendor 目錄,另一個是你指定的目錄。所以,我們還使用上面的例子:當請求引入包視圖時,laravel 會首先檢查 resources/views/vendor/courier 目錄中是否有相應的視圖,然后,如果沒有才會通過 loadViewFrom 方法來加載指定的目錄下的視圖。這就引入了一種自定義包視圖的簡便方式。

發布視圖

如果你希望有一種簡單的方式將包的視圖發布到 resources/views/vendor 目錄。你可以在服務提供者中使用 publishes 方法。publishes 方法接收一個包視圖路徑和其發布地址路徑所組成的數組:

/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');

   $this->publishes([
     __DIR__./path/to/views' => resource_path('views/vendor/courier'),
   ]);
 }

現在,當你通過命令行工具使用 vendor:publish Artisan 命令時,你的包視圖會被復制到其所指定的位置。

譯文

如果你的包中包含了翻譯文件。你可以使用 loadTranslationsFrom 方法來指導 laravel 如何載入它們。比如,如果你的包名稱為 'courier',你應該使用如下的方式在你的服務提供者的 boot 方法中添加:

/**
* Perform post-registration booting of services
*
* @return void
*/
public function boot()
{
  $this->loadTranslationsFrom(__DIR__./path/to/translations', 'courier');
}

包譯文的引入使用 package::filer.line 類似的語法。所以,你可以像這樣來加載 courier 包中的 messages 文件的 welcome 鍵:

echo trans('courier::messages.welcome');

發布譯文

如果你希望發布包的譯文到應用的 resources/lang/vendor 目錄,你可以使用服務提供者的 publishes 方法。publishes 方法接收一個包含包路徑和其相應的發布路徑所組成的數組。比如,發布 courier 包中的譯文:

/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');

   $this->publishes([
     __DIR__.'/path/to/translations' => resource_path('lang/vendor/courier')
   ]);
 }

現在,當你通過命令行工具使用 vendor:publish Artisan 命令時,包中的譯文會自動的發布到指定的位置。

配置文件

通常,你希望發布你的包配置文件到應用的 config 目錄。這樣就允許用戶通過簡單的配置來覆蓋默認的配置選項。你可以使用 publishes 方法來發布配置文件:

/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   $this->publishes([
     __DIR__.'/path/to/config/courier.php' => config_path('courier.php'),
   ]);
 }

現在當使用你包的用戶使用 laravel 的 vendor:push 命令時,你的配置文件將會復制到指定的位置。當然,一旦你的配置文件被發布到 config 目錄,它就可以像訪問其他配置文件一樣被訪問:

$value = config('courier.option');

默認的包配置

你也可以選擇合并包的默認配置和應用復制的配置。這樣就允許用戶只引入其真實需要變更的配置選項。你可以使用 mergeConfigFrom 方法來在你的服務提供者的 register 方法中進行合并:

/**
 * Register bindingsin the container.
 *
 * @return void
 */
 public function register()
 {
   $this->mergeConfigFrom(
     __DIR__.'/path/to/config/courier.php', 'courier'
   );
 }

公共資源文件

你的包文件中可能含有一些資源文件比如 JavaScript,CSS,圖片。你同樣可以在你的服務提供者中使用 publishes 方法來發布這些資源到應用的 public 目錄。我們同樣可以添加一個 public 組標簽,這樣可以選擇在發布時只發布 public 標簽組的文件:

/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   $this->published([
     __DIR__.'/path/to/assets' => public_path('vendor/courier'),
   ], 'public');
 }

現在,使用你的包的用戶在執行 vendor:publish 命令時,你的資源文件會被發布到指定的位置。如果你需要每次發布資源時覆蓋之前發布的內容,你可以使用 --force 標識:

php artisan vendor:publish --tag=public --force

如果你希望你的公共資源總是在發布時是最新的版本,你應該在你的 composer.json 文件中的 post-update-cmd 列中添加上述命令。

發布組文件

你可能希望將前端資源和后端資源進行分組分開發布。比如,你可能希望用戶在發布配置文件的同時并不重新發布更新公共資源文件。你可以通過在使用 publishes 方法時對發布項打標簽的方式來對發布進行分組:

/**
 * perform post-registration booting of services.
 *
 * @return void
 */
 public function boot()
 {
   $this->publishes([
     __DIR__.'/../config/package.php' => config_path('package.php')
   ], 'config');

   $this->publishes([
     __DIR__.'/../database/migrations/' => database_path('migrations')
   ], 'migrations');
 }

現在,你的包用戶可以在發布文件時通過組標簽來分開發布了:

php artisan vendor:publish --provider="Vendor\Providers\PackageServiceProvider"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,619評論 0 121
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • 一. 說明 以下內容大部分引用Laravel China社區的文章 - 分享下團隊的開發規范 ——《Laravel...
    knghlp508閱讀 7,891評論 0 28
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評論 25 708
  • 姓名:鄭文華 公司:寧波大發化纖有限公司 《六項精進》289期學員 【日精進打卡第106天】 【知~學習】 《六項...
    13c78e1e6538閱讀 154評論 0 0