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
。
繼續修改,使得在運行 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 ,也可以對現有的組件進行擴展。
也可以參考其他包項目來進一步完善自己的項目組建。