<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 2019 年 1 月 26 日 發布 >[info] 相信大家一定希望官方能夠發布更多的擴展和插件,但事實上這個想法并不現實,隨著官方同時維護的擴展越來越多(目前已經參與維護的擴展數量超過36個),很難及時更新和迭代,因此需要大家一起來參與貢獻,眾人拾柴火焰高,希望大家多參與`ThinkPHP5`的生態,來添磚加瓦。 本篇我們來聊聊應該如何正確的貢獻自己的`ThinkPHP5`擴展。 `ThinkPHP`擴展主要包括兩種類型:第一種是依賴`ThinkPHP`的(某個版本),比如某個緩存驅動,某個中間件等等,僅用于ThinkPHP開發的項目;第二種是不依賴`ThinkPHP`的獨立(功能)類庫,這個涉及的范疇比較廣,并且可以用于任何項目。 ## 遵循規范 無論是哪一種類型的擴展,都應該使用`Composer`包的方式來開發和安裝使用(`ThinkPHP5`的官方擴展全部是基于`Composer`安裝的)。 如果還不清楚如何制作一個`Composer`包,可以參考這篇:[如何創建一個自己的 Composer 庫](https://juejin.im/entry/57d7c3d2a0bb9f0057f244fc)。 >[info] 要注意的是,作為一個規范的`Composer`包,代碼風格必須嚴格遵循`PSR-2`規范和使用`PSR-4`自動加載規范。 獨立功能類庫沒有特別的要求,一般明確PHP的版本要求和其它依賴即可,并選擇一個開源協議,然后自己做好測試和添加相關說明(`readme.md`)或者附上文檔地址即可,所以不做特別的說明。 ## `ThinkPHP`專用擴展 如果是開發`ThinkPHP5`專屬的擴展,最好的辦法是參考官方的相關擴展進行,但務必注意,針對不同的ThinkPHP版本你需要不同的實現(通常可以采用分支的形式,并依賴不同的框架版本),主要包括: ### 緩存驅動 以ThinkPHP`5.1`版本為例,如果要擴展一個ThinkPHP的緩存驅動,只需要繼承系統的緩存驅動基礎類`think\cache\Driver`,并實現下面的抽象方法。 ``` /** * 判斷緩存是否存在 * @access public * @param string $name 緩存變量名 * @return bool */ abstract public function has($name); /** * 讀取緩存 * @access public * @param string $name 緩存變量名 * @param mixed $default 默認值 * @return mixed */ abstract public function get($name, $default = false); /** * 寫入緩存 * @access public * @param string $name 緩存變量名 * @param mixed $value 存儲數據 * @param int $expire 有效時間 0為永久 * @return boolean */ abstract public function set($name, $value, $expire = null); /** * 自增緩存(針對數值緩存) * @access public * @param string $name 緩存變量名 * @param int $step 步長 * @return false|int */ abstract public function inc($name, $step = 1); /** * 自減緩存(針對數值緩存) * @access public * @param string $name 緩存變量名 * @param int $step 步長 * @return false|int */ abstract public function dec($name, $step = 1); /** * 刪除緩存 * @access public * @param string $name 緩存變量名 * @return boolean */ abstract public function rm($name); /** * 清除緩存 * @access public * @param string $tag 標簽名 * @return boolean */ abstract public function clear($tag = null); ``` ### 數據庫驅動 要支持某個特殊的數據庫(包括`NoSQL`數據庫),可以參考官方的`Oracle`驅動擴展和`MongoDb`驅動擴展。 * `Oracle`擴展 [topthink/think-oracle](https://github.com/top-think/think-oracle) * `MongoDb`擴展 [topthink/think-mongo](https://github.com/top-think/think-mongo) 對于PDO支持的數據庫驅動,`Oracle`擴展就是一個典型的例子,你通常只需要實現數據庫連接驅動(繼承系統的`think\db\Connection`類)和數據庫解析驅動(繼承系統的`think\db\Builder`類)即可。 而對于非PDO支持的數據庫,`Mongo`擴展就是一個典型例子,通常你還需要額外實現一個數據庫查詢驅動類(繼承`think\db\Query`類),并且這種情況下,你的數據庫連接驅動和解析驅動可以無需繼承系統的基類。 ### Session驅動 對于`Session`驅動其實很簡單,你只需要基于`SessionHandlerInterface`接口實現即可,也就是包含如下方法實現。 ``` abstract public close ( void ) : bool abstract public destroy ( string $session_id ) : bool abstract public gc ( int $maxlifetime ) : int abstract public open ( string $save_path , string $session_name ) : bool abstract public read ( string $session_id ) : string abstract public write ( string $session_id , string $session_data ) : bool ``` ### 日志驅動 ThinkPHP的日志驅動,其實是一個獨立的類庫,而且只需要實現一個`save`方法,可以參考官方的[`SeasLog`](https://github.com/top-think/think-seaslog)驅動實現。 ``` /** * 日志寫入接口 * @access public * @param array $log 日志信息 * @param bool $append 是否追加請求信息 * @return bool */ public function save(array $log = [], bool $append = false): bool ``` ### Trace驅動 ThinkPHP的頁面Trace驅動也是一個獨立的類庫,只需要實現一個`output`方法。 ``` /** * 調試輸出接口 * @access public * @param Response $response Response對象 * @param array $log 日志信息 * @return bool|string */ public function output(Response $response, array $log = []) ``` ### 模板引擎擴展 ThinkPHP的模板引擎擴展也是一個獨立的類庫實現,主要需要實現的方法包括: ``` /** * 檢測是否存在模板文件 * @access public * @param string $template 模板文件或者模板規則 * @return bool */ abstract public function exists(string $template) : bool; /** * 渲染模板文件 * @access public * @param string $template 模板文件 * @param array $data 模板變量 * @return void */ abstract public function fetch(string $template, array $data = []) : void; /** * 渲染模板內容 * @access public * @param string $content 模板內容 * @param array $data 模板變量 * @return void */ abstract public function display(string $content, array $data = []) : void; /** * 配置模板引擎 * @access private * @param string|array $name 參數名 * @param mixed $value 參數值 * @return void */ abstract public function config($name, $value = null); ``` 具體實現可以參考[`think-twig`](https://github.com/yunwuxin/think-twig)擴展和[`think-blade`](https://github.com/terranc/think-blade)擴展。 ### 命令行擴展 ThinkPHP命令行擴展主要是用于擴展命令行的指令,這種方式的擴展可以和某個獨立類庫同時存在,提供某項功能的命令行指令配合。官方的[隊列擴展](https://github.com/top-think/think-queue)和[`Swoole`](https://github.com/top-think/think-swoole)擴展等都屬于這個范疇,也是用途最廣泛的擴展形式。 命令行擴展的指令注冊可以使用下面的方式: ``` // 注冊命令行指令 \think\Console::addDefaultCommands([ // 指令名 => 對應的命令類 'swoole' => '\\think\\swoole\\command\\Swoole', 'swoole:server' => '\\think\\swoole\\command\\Server', ]); ``` 命令類必須繼承系統的`think\console\Command`類,可以參考[掌握命令行的表格輸出](https://blog.thinkphp.cn/754434)一文中的描述來完成命令行指令的實現。 ### 分頁顯示驅動 ThinkPHP的分頁默認使用的是`Bootstrap`驅動,你也可以自己擴展一個其它的驅動,以滿足不同的分頁顯示需求。 分頁驅動必須繼承系統的`think\Paginator`類,具體可以參考內置的`think\paginator\driver\Bootstrap`類的實現。 ### 行為擴展 ThinkPHP的行為類可以不需要繼承任何的類庫,只需要實現一個`run`方法 ~~~ public function run($params); ~~~ 如果需要使用額外的參數,可以使用依賴注入,具體可以參考官方手冊的[鉤子和行為](http://www.hmoore.net/manual/thinkphp5_1/354129)章節內容。 ### 中間件 ThinkPHP5.1高版本支持中間件,所以你可以通過中間件的方式來擴展功能。 中間件無需繼承任何的類,只需要實現一個`handle`方法, ~~~ public function handle($request, \Closure $next) ~~~ 具體可以參考官方手冊的[中間件](http://www.hmoore.net/manual/thinkphp5_1/564279)章節內容。 ### `Response`擴展 系統內置的`Response`不一定滿足所有的需求,你完全可以擴展一個`Response`類來實現特殊的需求。 `Response`擴展必須繼承系統的`think\Response`類,并且必須實現`output`方法。 ``` /** * 處理數據 * @access protected * @param mixed $data 要處理的數據 * @return mixed */ protected function output($data) ``` ## 關于配置文件 如果你的ThinkPHP擴展(通常是專屬擴展)需要使用獨立的配置文件,你可以在擴展中自帶一個默認配置,并且在安裝擴展的同時復制到框架的配置目錄下。 實現方式是修改你的`composer.json`文件,添加如下定義項: ``` // type必須指定為think-extend "type": "think-extend", "extra": { "think-config": { // 配置文件名 : 默認的配置文件 "swoole": "src/config/swoole.php", } } ``` ## 官方推薦 由于`Composer`類庫包太多,如果你認為自己的擴展很優秀,希望吸引更多用戶使用,只要能夠保持自主維護更新,可以把擴展提交給官方,由官方來推薦給開發者。 目前已經整理的推薦擴展可以參考:[ThinkPHP5相關資源匯總](https://blog.thinkphp.cn/913360)的第三方擴展推薦,每期的開發者周刊中也會推薦一些好用的擴展。 >[danger]### 你可以在本文最后的評論里面,提交自己開發的`Composer`類庫或者擴展包地址,我們會陸續在開發者周刊中進行推薦(如果同時有相關的使用教程投稿最佳)。同時我們會在今年選擇合適的時間進行一次擴展評選活動,敬請期待!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看