擴展包開發(fā)

2018-12-17 10:54 更新

介紹

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

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

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

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

           

視圖

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

視圖

擴展包的視圖基本上使用兩個雙冒號來指定:

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

           

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

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

           

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

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

           

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

視圖的發(fā)布

發(fā)布擴展包的視圖到 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)在當您擴展包的用戶使用 Laravel 的命令 vendor:publish 您的視圖目錄將會被復(fù)制到所特定的目錄

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

php artisan vendor:publish --force

           

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

           

語言

擴展包的語言文件基本上使用兩個雙冒號來指定:

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

           

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

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

           

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

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

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

           

           

配置文件

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

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

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

           

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

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

           

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

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

           

           

公共資源

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

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

           

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

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

           

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

           

發(fā)布分類文件

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

// 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ā)布這些擴展包里的文件。

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

           

           

路由

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

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

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號