如何創建自己的 Laravel 包

How to create your own package for laravel

如何創建自己的 Laravel 包

爲了組(tao)件(bi)化(xue)開(xi)發,在最近做項目的時候,把一部分作爲單獨的組件來開發。組件化離不開跟包打交道,經過最近的折騰,記錄一下自己開發包的過程。

首先,新建一個 Laravel 項目,並在項目根目錄下新建 packages 文件夾。
在 packages 文件夾中,新建以你名字爲命名的文件夾,並在此文件夾內建立以項目名命名的文件夾。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.lock
├── config
├── database
├── gulpfile.js
├── package.json
├── packages
└── sliverwing
└── packagedemo
├── phpunit.xml
├── public
├── readme.md
├── resources
├── routes
├── server.php
├── storage
├── tests
├── vendor
└── yarn.lock

如上例,進入 packages\sliverwing\packagedemo 運行 composer init 命令,進入 Composer config generator
分別鍵入 Package name Description Author Minimum Stability Package Type License 和交互方式定義所依賴的庫 require require-dev 後便可生成該包的 composer.json
接下來,編輯 composer.json 增加以下內容:

1
2
3
4
5
"autoload": {
"psr-4": {
"Sliverwing\\PackageDemo\\": "src/"
}
},

這裏定義了,該包發佈後 composer 如何對項目進行自動加載。
在 Laravel 項目下的 composer.json 中,修改 autoload 配置,使得在編寫包的過程中 Laravel 項目能自動加載包。

1
2
3
4
5
6
7
8
9
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Sliverwing\\PackageDemo\\": "packages/sliverwing/packagedemo/src/"
}
},

接下來,在 packagedemo 中新建 src config migrations 文件夾。

1
2
3
4
5
6
.
└── packagedemo
├── composer.json
├── config
├── migrations
└── src

src 這裏是主要存放代碼的地方。可以參考 Laravel 中 app 的目錄來組織 src 文件夾中的目錄。
config 和 migrations 比較容易理解,存放包的配置文件和擴展,當然可以根據包內業務的需要加入 views 或者其他需要 pulish 的文件目錄。

我們在 config 文件夾下新建 packagedemo.php,用來保存包的配置信息。

回到 laravel 項目的根目錄,使用 php artisan make:provider PackageDemoServiceProvider 創建包的 ServiceProvider
把 app\Providers\PackageDemoServiceProvider.php 移動到 packages\sliverwing\packagedemo\src 下,並修改 namespace

參考 https://laravel.com/docs/5.3/packages#service-providers

繼續修改,使得在運行 php artisan vendor:publish 時,我們的配置文件可以複製到 Laravel 工程的 config 文件下。
在 boot 方法裏,新增代碼如下:

1
2
3
$this->publishes([
__DIR__.'/../config/packagedemo.php' => config_path('packagedemo.php'),
]);

接下來,把 PackageDemoServiceProvider 加入到 config\app.php 中。

1
2
3
4
/*
* Package Service Providers...
*/
Sliverwing\PackageDemo\PackageDemoServiceProvider::class,

在 Laravel 項目目錄下,運行 composer dump-autload,然後運行 php artisan vendor:publish 可以發現,包下面的配置文件複製到 Laravel 項目中 config 文件夾下了。

1
2
3
4
5
[13:30:21] sliverwing:package_demo $ pa vendor:publish
Copied Directory [/vendor/laravel/framework/src/Illuminate/Notifications/resources/views] To [/resources/views/vendor/notifications]
Copied Directory [/vendor/laravel/framework/src/Illuminate/Pagination/resources/views] To [/resources/views/vendor/pagination]
Copied File [/packages/sliverwing/packagedemo/config/packagedemo.php] To [/config/packagedemo.php]
Publishing complete for tag []!

接下來,可以在 src 文件夾下創建 Http\Controllers 文件夾,並根據業務需要,新增包內的 Controller ,也可以對現有的組件進行擴展。
也可以參考其他包項目來進一步完善自己的項目組建。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章