擴(kuò)展包開發(fā)

2018-12-17 10:54 更新

介紹

開發(fā)擴(kuò)展包是添加功能到 Laravel 最主要的方法。擴(kuò)展包可以是任何處理日期的方式。例如,Carbon,或是一個(gè)全套的 BDD testing 框架。例如,Behat            

當(dāng)然,有非常多不同類型的擴(kuò)展包。有些擴(kuò)展包是獨(dú)立的,意思是此擴(kuò)展包運(yùn)作且兼容于任何的框架,不只有 Laravel。Carbon 以及 Behat 都是這類的擴(kuò)展包。任何這類的擴(kuò)展包只需要在您的 composer.json 文件里配置就可以使用。

另一方面,其他的擴(kuò)展包所設(shè)計(jì)的目的是只要在 Laravel 上使用。這些擴(kuò)展包可能包含路由、控制器、視圖以及擴(kuò)展包的相關(guān)配置,目的是為了增加 Laravel 的應(yīng)用。接下來的說明主要涵蓋了 Laravel 開發(fā)這些擴(kuò)展包的重點(diǎn)。

所有 Laravel 擴(kuò)展包都發(fā)布到 Packagist 以及 Composer,所以學(xué)習(xí)這些美好的 PHP 擴(kuò)展包管理工具是必須的。

           

視圖

您擴(kuò)展包內(nèi)部的架構(gòu)全部由您自己規(guī)劃。然而,原則上會(huì)有一個(gè)或更多的 服務(wù)提供者. 服務(wù)提供者包含著所有的 服務(wù)容器 綁定,也定義了所有您擴(kuò)展包的相關(guān)配置、視圖以及語言文件在什么地方。

視圖

擴(kuò)展包的視圖基本上使用兩個(gè)雙冒號(hào)來指定:

return view('package::view.name');

           

所有您所要做的只有告訴 Laravel 您所配置擴(kuò)展包名稱視圖的位置在哪里。如果您的擴(kuò)展包取名為 “courier” 您可能需要添加如下到您的服務(wù)提供者的 boot 方法:

public function boot(){
    $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');}

           

現(xiàn)在您可以使用如下的語法來加載擴(kuò)展包的視圖:

return view('courier::view.name');

           

當(dāng)您使用 loadViewsFrom 方法,Laravel 實(shí)際上為了您的視圖注冊(cè)了兩個(gè)位置。一個(gè)是您應(yīng)用程序的 resources/views/vendor 目錄,一個(gè)是您指定的目錄。所以使用我們的例子 courier 當(dāng)要求一個(gè)擴(kuò)展包的視圖時(shí),Laravel 會(huì)第一時(shí)間檢查是否有一個(gè)開發(fā)者自行自定義在 resources/views/vendor/courier                的視圖存在。然而如果還沒有這個(gè)路徑的視圖被自定義。Laravel 會(huì)搜索您在擴(kuò)展包 loadViewsFrom 方法里所指定的視圖。這個(gè)方法讓個(gè)別的用戶可以方便的自定義且覆寫您在擴(kuò)展包里的視圖。

視圖的發(fā)布

發(fā)布擴(kuò)展包的視圖到 resources/views/vendor 目錄,您必須在服務(wù)提供者里的 boot 方法里使用 publishes 方法:

public function boot(){
    $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');

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

           

現(xiàn)在當(dāng)您擴(kuò)展包的用戶使用 Laravel 的命令 vendor:publish 您的視圖目錄將會(huì)被復(fù)制到所特定的目錄

如果您想要覆寫已存在的文件,可以使用 --force:

php artisan vendor:publish --force

           

注意: 您可以使用 publishes 方法,發(fā)布任何您的文件到任何您想要的地方。

           

語言

擴(kuò)展包的語言文件基本上使用兩個(gè)雙冒號(hào)來指定:

return trans('package::file.line');

           

所有您所要做的只有告訴 Laravel 您所配置擴(kuò)展包名稱的語言位置在哪里。如果您的擴(kuò)展包取名為 "courier" 您可能需要添加如下的語法到您的服務(wù)提供者的 boot 方法:

public function boot(){
    $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');}

           

注意在您的 translations 目錄里,必須要有更下一層的目錄,例如 en es ru。

現(xiàn)在您可以使用下方的語法來加載您擴(kuò)展包的語言:

return trans('courier::file.line');

           

           

配置文件

基本上,您可能想要將您擴(kuò)展包相關(guān)配置的文件發(fā)布到應(yīng)用程序本身的配置目錄 config。這將允許您擴(kuò)展包的用戶簡(jiǎn)單的覆寫這些默認(rèn)的配置文件。

發(fā)布擴(kuò)展包的配置文件只需要在服務(wù)提供者里的 boot 方法里使用 publishes 方法:

$this->publishes([
    __DIR__.'/path/to/config/courier.php' => config_path('courier.php'),]);

           

現(xiàn)在當(dāng)擴(kuò)展包的用戶執(zhí)行 vendor:publish 命令,您的文件將會(huì)被復(fù)制到特定的位置。當(dāng)然只要配置文件已經(jīng)被發(fā)布,就可以如其他配置文件一樣被訪問:

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

           

您可能也選擇想要合并您擴(kuò)展包的配置文件和應(yīng)用程序里的副本配置文件。這允許您的用戶在已經(jīng)被發(fā)布的副本配置文件里只包含任何他們想要覆寫的配置選項(xiàng)。如果想要合并配置文件,可在服務(wù)提供者里的 register 方法里使用 mergeConfigFrom方法

$this->mergeConfigFrom(
    __DIR__.'/path/to/config/courier.php', 'courier');

           

           

公共資源

您的擴(kuò)展包也許會(huì)有一些資源文件比如 JavaScript,CSS,和圖片。如果要發(fā)布資源,可以在您的服務(wù)提供商的 boot 方法中使用 publishes 方法。在這個(gè)例子中,我們同樣增加了 “public” 資源的分區(qū)標(biāo)記。

$this->publishes([
    __DIR__.'/path/to/assets' => public_path('vendor/courier'),], 'public');

           

現(xiàn)在當(dāng)擴(kuò)展包的用戶執(zhí)行 vendor:publish 命令,您的文件將會(huì)被復(fù)制到特定的位置。由于每次擴(kuò)展更新時(shí)都會(huì)覆蓋這些資源,你可以使用 --force 標(biāo)識(shí):

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

           

如果你想確保你的公共資源始終是最新的,你可以把這條命名添加到 composer.json 文件中的 post-update-cmd 列表中。

           

發(fā)布分類文件

您可能想要分別的發(fā)布一些分類的文件。舉例,您可能想要您的用戶可以分別發(fā)布擴(kuò)展包的配置文件與靜態(tài)資源文件。您可以使用 tagging 來達(dá)成:

// Publish a config file$this->publishes([
    __DIR__.'/../config/package.php' => config_path('package.php')], 'config');// Publish your migrations$this->publishes([
    __DIR__.'/../database/migrations/' => database_path('/migrations')], 'migrations');

           

您可以使用這些 tag,來分別發(fā)布這些擴(kuò)展包里的文件。

php artisan vendor:publish --provider="Vendor\Providers\PackageServiceProvider" --tag="config"

           

           

路由

在擴(kuò)展包里加載一個(gè)路由文件,只需要在服務(wù)提供者里的 boot 方法里使用 include :

根據(jù)服務(wù)提供者來包含一個(gè)路由文件

public function boot(){
    include __DIR__.'/../../routes.php';}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)