中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于 Laravel Route 的 ThinkSNS+ Component

發布時間:2020-08-07 07:24:55 來源:網絡 閱讀:360 作者:ThinkSNS官方 欄目:軟件技術

這里是傳送門:

《ThinkSNS+ 基于 Laravel master 分支,從 1 到 0,再到 0.1【ThinkSNS+研發日記系列一】》

《基于 Laravel 開發 ThinkSNS+ 中前端的抉擇(webpack/Vue)踩坑日記【ThinkSNS+研發日記系列二】》

在前面,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個,這里重點講以下如何實現 plus-component 的。

plus-component 是什么

就如同名字一樣,plus 代表的是 ThinlSNS+ 程序,用 - 分割 后面的 component 就是「包」或者我們理解成應用。在這里的「應用」指的是通過實現 API 或者 web 的功能。所以產生了這個類型。

但是 plus-component 不只是應用,也可以是簡單的功能拓展,例如medz/plus-storage-quniu就是拓展的七牛云儲存。

composer 插件的建立

既然涉及到路由,最開始的想法,其實是 /routes 目錄下生成文件,包的路由文件復制到這里來。后來,發現了問題不足。
最后想到,plus-component 的實現,不一定是基于路由的應用,也有可能是簡單的拓展。我們看下中間插件的接口類:

<?php
namespace Zhiyi\Component\Installer\PlusInstallPlugin;
use Closure;
use Illuminate\Console\Command;
use Illuminate\Console\OutputStyle;
interface InstallerInterface{
    public function setCommand(Command $command, OutputStyle $output);

    /**
     * Get the component info.
     *
     * @return void|\Zhiyi\Component\Installer\PlusInstallPlugin\ComponentInfoInterface
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function getComponentInfo();

    /**
     * 應用安裝.
     *
     * @param Closure $next
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function install(Closure $next);

    /**
     * 應用升級.
     *
     * @param Closure $next
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function update(Closure $next);

    /**
     * 應用卸載.
     *
     * @param Closure $next
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function uninstall(Closure $next);

    /**
     * 靜態資源.
     *
     * @return string 靜態資源目錄
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function resource();

    /**
     * 路由配置.
     *
     * @return string 路由配置文件列表
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function router();
    }

其中 router 成了非必需項。

轉而,擁有了三個 hook 方法 install、update 和 uninstall 方法,這三個分別對應的是安裝,升級,卸載。
而設計中,plus-component 中間插件會在 Laravel 的 /config/component.php 中增加如下配置:

'medz/plus-component-example' => 
  array (
    'installed' => false,
    'installer' => 'Medz\\Component\\ZhiyiPlus\\PlusComponentExample\\Installer\\Installer',
  ),

中間插件的 composer.json 配置

其實很簡單,看到上面添加到 /config/component.php 的代碼了, installer 項哪里來的呢?看下 包的配置:

{
    "name": "medz/plus-component-example",
    "type": "plus-component",
    "require": {
        "zhiyicx/plus-install-plugin": "^1.1"
    },
    "autoload": {
        "psr-4": {
                    "Medz\\Component\\ZhiyiPlus\\PlusComponentExample\\": "src/"
                }
    },
    "extra": {
        "installer-class": "Medz\\Component\\ZhiyiPlus\\PlusComponentExample\\Installer\\Installer"
    }
}

就是最后的 extra.installer-class 配置的,這里是完整的 class name,這樣,在 composer 插件執行的時候讀取這個額外的配置,并寫入到 Laravel 的配置文件中。

install/update/uninstall

在 ThinkSNS+ 中有 php artisan component [install|update|unstall] vendor/name 這樣一個命令,主要是用作 包的安裝,升級,卸載。
實際運行如下:

php artisan component install medz/plus-component-example
通過這樣的方式安裝包,而這個命令會讀取 /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 中如下:

protected function mapVendorRoutes()
    {
        $files = config('component_routes', []);
        foreach ($files as $file) {
            include_once $file;
        }
    }

可能你會誤會,為什么只是 include 進來呢?是的,這里的代碼其實是參照 Route::group 來的,而在包里面的文件,可以正常的使用 Route::* 進行路由配置。

resource

既然可以基于路由,那就必然會存在靜態資源的問題,在接口類中也有這樣的規定:

 /**
     * 靜態資源.
     *
     * @return string 靜態資源目錄
     *
     * @author Seven Du <shiweidu@outlook.com>
     * @homepage http://medz.cn
     */
    public function resource();

這里返回在包中靜態資源存儲的目錄,執行安裝或者升級命令的時候復制到 /public/vendor/name 目錄下來達到靜態資源發布的功能。

更高級的封裝

這里其實是只模式封裝,在 ThinkSNS+ 的 php artisan component 其實還有一個 --link 參數,做什么用的?其實不難理解,就是吧靜態資源由原來的復制變成創建軟鏈。這在開發過程中很有用。

下期預告:下一篇文章,會簡單的講以下 ThinkSNS+ 自封裝的命令實現。

開源代碼倉庫:

GitHub:https://github.com/zhiyicx/thinksns-plus(點擊星,每日關注開發動態。)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

威宁| 无为县| 麻城市| 澄江县| 区。| 清水县| 余庆县| 晋宁县| 宜春市| 陇西县| 青阳县| 江门市| 中宁县| 阜新市| 新宾| 蛟河市| 郁南县| 彩票| 通化县| 泸定县| 故城县| 繁昌县| 盐亭县| 白朗县| 共和县| 伊宁市| 富川| 红桥区| 嘉义市| 台中市| 正宁县| 九龙坡区| 略阳县| 平南县| 涟源市| 丰顺县| 莱阳市| 扎赉特旗| 陈巴尔虎旗| 吉隆县| 原阳县|