laravel 基礎(chǔ)教程 —— 包開發(fā)

包開發(fā)

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

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

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

服務(wù)提供者

服務(wù)提供者是 laravel 和包的連接點推沸。服務(wù)提供者主要負(fù)責(zé)包內(nèi)容在服務(wù)容器中的綁定以及應(yīng)用應(yīng)該如何加載資源文件如視圖,配置文件和語言文件券坞。

一個服務(wù)提供者應(yīng)該繼承 Illuminate\Support\ServiceProvider 類并且包含兩個方法: registerboot鬓催。基類 ServiceProvider 類位于 Composer 包的 illuminate/support 中报慕。你應(yīng)該在你的包中添加這個依賴深浮。

路由

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

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

資源

視圖

你需要告訴 laravel 視圖的位置才能使 laravel 加載包中的視圖。你可以通過服務(wù)提供者的 loadViewsFrom 方法蜗顽。loadViewsFrom 方法接受兩個參數(shù):視圖的路徑和包的名稱布卡。比如,如果你的包名稱是“courier”雇盖,你應(yīng)該像下面一樣在 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'); 
});

覆蓋包視圖

當(dāng)你使用 loadViewsFrom 方法來加載視圖時崔挖,laravel 實際上是注冊了兩個視圖位置:一個是應(yīng)用的 resources/views/vendor 目錄贸街,另一個是你指定的目錄庵寞。所以,我們還使用上面的例子:當(dāng)請求引入包視圖時薛匪,laravel 會首先檢查 resources/views/vendor/courier 目錄中是否有相應(yīng)的視圖捐川,然后,如果沒有才會通過 loadViewFrom 方法來加載指定的目錄下的視圖逸尖。這就引入了一種自定義包視圖的簡便方式古沥。

發(fā)布視圖

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

/**
 * 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'),
   ]);
 }

現(xiàn)在岩齿,當(dāng)你通過命令行工具使用 vendor:publish Artisan 命令時,你的包視圖會被復(fù)制到其所指定的位置苞俘。

譯文

如果你的包中包含了翻譯文件盹沈。你可以使用 loadTranslationsFrom 方法來指導(dǎo) laravel 如何載入它們。比如苗胀,如果你的包名稱為 'courier'襟诸,你應(yīng)該使用如下的方式在你的服務(wù)提供者的 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');

發(fā)布譯文

如果你希望發(fā)布包的譯文到應(yīng)用的 resources/lang/vendor 目錄歌亲,你可以使用服務(wù)提供者的 publishes 方法。publishes 方法接收一個包含包路徑和其相應(yīng)的發(fā)布路徑所組成的數(shù)組澜驮。比如陷揪,發(fā)布 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')
   ]);
 }

現(xiàn)在,當(dāng)你通過命令行工具使用 vendor:publish Artisan 命令時杂穷,包中的譯文會自動的發(fā)布到指定的位置悍缠。

配置文件

通常,你希望發(fā)布你的包配置文件到應(yīng)用的 config 目錄耐量。這樣就允許用戶通過簡單的配置來覆蓋默認(rèn)的配置選項飞蚓。你可以使用 publishes 方法來發(fā)布配置文件:

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

現(xiàn)在當(dāng)使用你包的用戶使用 laravel 的 vendor:push 命令時,你的配置文件將會復(fù)制到指定的位置廊蜒。當(dāng)然趴拧,一旦你的配置文件被發(fā)布到 config 目錄,它就可以像訪問其他配置文件一樣被訪問:

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

默認(rèn)的包配置

你也可以選擇合并包的默認(rèn)配置和應(yīng)用復(fù)制的配置山叮。這樣就允許用戶只引入其真實需要變更的配置選項著榴。你可以使用 mergeConfigFrom 方法來在你的服務(wù)提供者的 register 方法中進行合并:

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

公共資源文件

你的包文件中可能含有一些資源文件比如 JavaScript,CSS屁倔,圖片脑又。你同樣可以在你的服務(wù)提供者中使用 publishes 方法來發(fā)布這些資源到應(yīng)用的 public 目錄。我們同樣可以添加一個 public 組標(biāo)簽,這樣可以選擇在發(fā)布時只發(fā)布 public 標(biāo)簽組的文件:

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

現(xiàn)在问麸,使用你的包的用戶在執(zhí)行 vendor:publish 命令時往衷,你的資源文件會被發(fā)布到指定的位置。如果你需要每次發(fā)布資源時覆蓋之前發(fā)布的內(nèi)容口叙,你可以使用 --force 標(biāo)識:

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

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

發(fā)布組文件

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

/**
 * 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');
 }

現(xiàn)在疟呐,你的包用戶可以在發(fā)布文件時通過組標(biāo)簽來分開發(fā)布了:

php artisan vendor:publish --provider="Vendor\Providers\PackageServiceProvider"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市东且,隨后出現(xiàn)的幾起案子启具,更是在濱河造成了極大的恐慌,老刑警劉巖珊泳,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲁冯,死亡現(xiàn)場離奇詭異,居然都是意外死亡色查,警方通過查閱死者的電腦和手機薯演,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧了,“玉大人跨扮,你說我怎么就攤上這事⊙檎保” “怎么了衡创?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晶通。 經(jīng)常有香客問我璃氢,道長,這世上最難降的妖魔是什么狮辽? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任一也,我火速辦了婚禮,結(jié)果婚禮上隘竭,老公的妹妹穿的比我還像新娘塘秦。我一直安慰自己,他們只是感情好动看,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布尊剔。 她就那樣靜靜地躺著,像睡著了一般菱皆。 火紅的嫁衣襯著肌膚如雪须误。 梳的紋絲不亂的頭發(fā)上挨稿,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音京痢,去河邊找鬼奶甘。 笑死,一個胖子當(dāng)著我的面吹牛祭椰,可吹牛的內(nèi)容都是我干的臭家。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼方淤,長吁一口氣:“原來是場噩夢啊……” “哼钉赁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起携茂,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤你踩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讳苦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體带膜,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年鸳谜,在試婚紗的時候發(fā)現(xiàn)自己被綠了膝藕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡卿堂,死狀恐怖束莫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情草描,我是刑警寧澤览绿,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站穗慕,受9級特大地震影響饿敲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逛绵,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一怀各、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧术浪,春花似錦瓢对、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春法焰,著一層夾襖步出監(jiān)牢的瞬間秧荆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工埃仪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乙濒,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓卵蛉,卻偏偏與公主長得像颁股,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傻丝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,610評論 0 121
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理豌蟋,服務(wù)發(fā)現(xiàn),斷路器桑滩,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • 一. 說明 以下內(nèi)容大部分引用Laravel China社區(qū)的文章 - 分享下團隊的開發(fā)規(guī)范 ——《Laravel...
    knghlp508閱讀 7,889評論 0 28
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,323評論 25 707
  • 姓名:鄭文華 公司:寧波大發(fā)化纖有限公司 《六項精進》289期學(xué)員 【日精進打卡第106天】 【知~學(xué)習(xí)】 《六項...
    13c78e1e6538閱讀 151評論 0 0