基於 Laravel Route 的 ThinkSNS+ Component
在前麵,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個,這裏重點講以下如何實現 plus-component 的。
plus-component 是什麼
就如同名字一樣,plus 代表的是 ThinlSNS+ 程序,用 - 分割 後麵的 component 就是「包」或者我們理解成應用。在這裏的「應用」指的是通過實現 API 或者 web 的功能。所以產生了這個類型。
但是 plus-component 不隻是應用,也可以是簡單的功能拓展,例如medz/plus-storage-quniu就是拓展的七牛雲儲存。
composer 插件的建立
既然涉及到路由,最開始的想法,其實是 /routes 目錄下生成文件,包的路由文件複製到這裏來。後來,發現了問題不足。
最後想到,plus-component 的實現,不一定是基於路由的應用,也有可能是簡單的拓展。我們看下中間插件的接口類:
其中 router 成了非必需項。
轉而,擁有了三個 hook 方法 install、update 和 uninstall 方法,這三個分別對應的是安裝,升級,卸載。
而設計中,plus-component 中間插件會在 Laravel 的 /config/component.php 中增加如下配置:
中間插件的 composer.json 配置
其實很簡單,看到上麵添加到 /config/component.php 的代碼了, installer 項哪裏來的呢?看下 包的配置:
就是最後的 extra.installer-class 配置的,這裏是完整的 class name,這樣,在 composer 插件執行的時候讀取這個額外的配置,並寫入到 Laravel 的配置文件中。
install/update/uninstall
在 ThinkSNS+ 中有 php artisan component [install|update|unstall] vendor/name 這樣一個命令,主要是用作 包的安裝,升級,卸載。
實際運行如下:
通過這樣的方式安裝包,而這個命令會讀取 /config/component.php 的配置,從而得到 installer ,這樣,在運行不同的參數的時候後,調用 install,uodate,uninstall 等 需求 hook 達到目的。
router
在最上麵的接口類中你也看到了,有一個 router 方法,這個方法返回類型有兩個 void|string,所以, void 代表沒有路由,string 就表示包路由文件的絕對地址。
在 php artisan component 命令執行的時候,對應的添加 /config/component_routes.php 裏麵的配置。
在 /app/Providers/RouteServiceProvider.php 中如下:
可能你會誤會,為什麼隻是 include 進來呢?是的,這裏的代碼其實是參照 Route::group 來的,而在包裏麵的文件,可以正常的使用 Route::* 進行路由配置。
resource
既然可以基於路由,那就必然會存在靜態資源的問題,在接口類中也有這樣的規定:
這裏返回在包中靜態資源存儲的目錄,執行安裝或者升級命令的時候複製到 /public/vendor/name 目錄下來達到靜態資源發布的功能。
更高級的封裝
這裏其實是隻模式封裝,在 ThinkSNS+ 的 php artisan component 其實還有一個 --link 參數,做什麼用的?其實不難理解,就是吧靜態資源由原來的複製變成創建軟鏈。這在開發過程中很有用。
下期預告:下一篇文章,會簡單的講以下 ThinkSNS+ 自封裝的命令實現。
開源代碼倉庫:
GitHub:https://github.com/zhiyicx/thinksns-plus
最後更新:2017-09-25 15:33:49