<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # [教程] 掌握命令行的表格輸出 > ThinkPHP`V5.1.24`引入了一個新的`Table`對象,用于在命令行下面動態輸出表格,剛好最新的`route:list`指令中包含了大部分表格功能的實現,所以是學習Table對象的最好示例,本篇就通過分析該指令的代碼來掌握`Table`對象的用法。 [TOC=2,2] ## 初見端倪 `route:list`指令是一個用于查看路由定義的指令,我們先運行下看下在命令行下輸出的表格效果,有個感性的認識。 隨便在你的路由定義文件中定義一些路由規則,例如下面定義了一個閉包路由、一個資源路由和一個普通路由。 ~~~ Route::get('think', function () { return 'hello,ThinkPHP5!'; }); Route::resource('blog', 'Blog'); Route::get('hello/:name', 'index/hello'); ~~~ 在命令行下面(切換到項目根目錄)執行: ~~~ php think route:list ~~~ 你會看到下面的表格輸出: ![](https://box.kancloud.cn/3239aeaf0578b814c4df45a095d008c2_541x234.png) > 通過這個指令你可以清晰看到每個資源路由實際上會注冊7個路由規則。 是不是覺得很酷?? 當然了這個指令的功能遠不止這么簡單,我們后面會陸續講解。 ## 指令尋址 為了分析這個指令,我們先找到`route:list`指令對應的類文件(指令尋址),打開`\think\Console`類,找到`defaultCommands`屬性 ![](https://box.kancloud.cn/7e7549a22f5e05dc0310ed2e5b21a293_758x386.png) 這個屬性定義了核心內置的所有指令,數組的索引就是指令名,鍵值就代表了該指令對應的完整類名。可以看到`route:list`指令對應的就是`think\console\command\RouteList`類,接下來就來給大家分析下這個指令的代碼實現。 ## 指令定義 任何一個合法的指令類都必須繼承系統的`think\console\Command`類,`RouteList`類一共130行左右代碼,所以基本上很容易看明白,首先我們看第一個`configure`方法,該方法的作用就是配置當前指令的用法。 ![](https://box.kancloud.cn/5636d6d1f8ace1be12a8e34531bfe78b_861x180.png) `setName`方法就是指定當前類的指令名(注意指令名盡量使用小寫,并且不要包含除`:`、`_`之外的特殊字符)。 `addArgument`方法是添加指令參數,這里添加的style參數表示表格輸出的樣式。該方法的參數可以在`think\console\input\Argument`類的構造方法中查看。 ![](https://box.kancloud.cn/b297863562bf5288d9e42645b5646d1d_848x473.png) 第二個參數表示參數的類型必須或者可選,對于`route:list`指令而言,這個參數是可選的,因此傳入`Argument::OPTIONAL`,并且設置了該參賽的默認值是`default`。 `addOption`方法是添加指令選項,這里添加了`sort`和`more`兩個選項,并且分別設置了簡寫。 具體用法則可以在`think\console\input\Option`類的構造方法中看到。 ![](https://box.kancloud.cn/7e5e02b824e8fc572b5a0bb0c040fba2_1089x520.png) `setDescription`方法用于指定當前指令的描述信息。 我們可以用`-h`選項來查看下指令配置的最終效果(可以對任何指令使用`-h`或者`--help`選項來查看指令幫助) ~~~ php think route:list -h ~~~ ![](https://box.kancloud.cn/adbc7ff60c5bcf81de2eabc2545fae24_1000x288.png) ## 撥云見日 第二個方法是`execute`方法,該方法會在指令在執行的時候自動調用。 ![](https://box.kancloud.cn/f422d46bad72e2094d7f57b9a3ef3730_748x229.png) 可以看到`route:list`指令的執行操作很簡單,獲取路由定義列表的內容(這個時候會同時在命令行輸出)后就寫入一個`route_list.php`文件中。所有的真相都在`getRouteList()`這個方法里面了,這也是本文的關鍵所在。 再來深入分析`getRouteList()`方法。 ![](https://box.kancloud.cn/fbad1631b598e633e6dab688395859ac_445x37.png) 這行代碼可能很多人不明白,我先解釋下。由于ThinkPHP`5.1`的路由采用延時解析機制,如果不開啟測試模式的話,可能沒有辦法獲取到所有的路由規則的,尤其是當使用了路由分組和資源路由的時候,實際上都是在路由匹配后才會真正解析分組或者資源路由下面的實際路由規則。而`setTestMode(true)`的作用就是讓路由規則實時解析,這樣我們才能獲取到所有的路由規則。 ![](https://box.kancloud.cn/01e4fed9f0b2a0ea3347684308a7b15f_536x325.png) 這段代碼的作用則是獲取所有的路由定義文件,如果采用了配置數組方式定義的話也會批量導入。 >[danger] 配置數組方式定義路由規則在`5.1`版本中已經不再建議,在下一個大版本中就會廢除,所以盡量不要使用數組方式定義,而改為方法定義 ![](https://box.kancloud.cn/9e1b2886e93684fe37d9c502137ee3af_1103x128.png) 這段代碼的作用是在開啟注解路由的情況下進行注解路由的解析,有興趣的朋友可以通過跟蹤`think\Build`類的`buildRoute`方法的實現深入了解下注解路由是如何實現的,由于不再文本的講解范疇,所以暫且不表。 ## 表格輸出 前面鋪墊了那么多,接下來就要進入正題了(原來講了這么多廢話??) ![](https://box.kancloud.cn/526e408ca39f80c514a4d3f748784e4c_804x200.png) 這段代碼首先實例化了一個`think\console\Table`類,并通過`setHeader`方法設置輸出的表頭信息。 `setHeader`方法的參數可以參考`Table`類的代碼 ![](https://box.kancloud.cn/37418c61a0bcfd7e876f7e453d2cb27a_796x306.png) 第一個參數是表頭信息(數組),其實還有第二個參數可以控制表頭信息的對齊方式,默認是左對齊,如果要讓表頭信息居中對齊或者居右,可以使用下面的方式 把 ~~~ $table->setHeader($header); ~~~ 改為居中對齊 ~~~ // 表頭居中對齊 $table->setHeader($header, Table::ALIGN_CENTER); ~~~ 再次運行指令后,輸出的效果變為: ![](https://box.kancloud.cn/d70b1c8ce79e3edb4ebe30004947316e_533x231.png) 或者居右對齊 ~~~ // 表頭居右對齊 $table->setHeader($header, Table::ALIGN_RIGHT); ~~~ ![](https://box.kancloud.cn/e125e6e11e4282b1277b01de1ce0ab80_532x234.png) 這里判斷是否傳入了`more`選項(參考前面講到的指令配置部分),如果有則附加額外的表頭信息。也就是說,如果使用了`--more`或者`-m`你就能看到關于路由的詳細信息(增加了路由參數和變量規則)。 ![](https://box.kancloud.cn/b5c399da60be44317a6623c2cf995cf3_815x232.png) ![](https://box.kancloud.cn/4d1adf6193369c31876defb08dd88ec9_890x358.png) 這段代碼的作用是獲取路由定義列表數據,事實上,`think\Route`類已經封裝好了一個獲取已經定義的路由規則列表方法`getRuleList()`,所以在指令中我們不需要自己實現。有興趣的朋友,可以參考下`think\route\RuleName`類的`setRule()`方法和`getRuleList()`兩個方法的代碼實現,在此略過不提。 由于`getRouteList()`方法獲取的數據是一個三維數組,我們需要重新進行封裝為一個Table類可以輸出的二維數組格式。同樣在封裝單元格數據的時候也判斷是否使用了`--more`選項而使用不同的數據。最終封裝到的二維數組保存到`rows`數組變量中。 ![](https://box.kancloud.cn/e0111f50cfd72167e26b1bcef61ca4fa_526x305.png) 這段代碼的作用如果傳入了`--sort`選項,則對二維數組進行指定排序排序。 排序的指定方式有兩種:一種是直接從0開始的序號,0表示對第一列排序,1表示對第二列排序,以此類推,另外一種方式是對指定的列名進行排序。 例如我們要對第三列(請求類型)進行排序,可以用 ![](https://box.kancloud.cn/39bdebbf243350658a74d47c4014f992_528x230.png) 由于這樣不夠直觀,系統還提供了第二種方式 ![](https://box.kancloud.cn/d0f83a39b2e121c3cf8fc2275eaad33b_526x232.png) ![](https://box.kancloud.cn/604a2d1b868648359614bbf659cecfa4_387x45.png) 這段代碼的作用就是給`Table`類實例對象設置表格數據,和`setHeader()`方法一樣,`setRows()`方法也支持指定對齊方式。 ![](https://box.kancloud.cn/375bc545ef4a60bb73c94e2e3f4c67b1_787x333.png) 如果我們把 ~~~ $table->setRows($rows); ~~~ 改成: ~~~ // 表格數據居右對齊 $table->setRows($rows, Table::ALIGN_RIGHT); ~~~ 再次運行指令后的輸出效果如圖: ![](https://box.kancloud.cn/1031bb8fed73ffb21fa584b5737e513c_528x230.png) ![](https://box.kancloud.cn/e86646c52e07fed240f129dd6ede7cd4_471x105.png) 這段代碼的作用是使用`setStyle()`方法指定表格輸出的樣式,我們之前看到的都是默認的樣式輸出。 現在我們來看下可以支持哪些樣式, ![](https://box.kancloud.cn/cf0da2c5a73e913a8c2fdce03a957f88_521x225.png) ![](https://box.kancloud.cn/e7cabd9326d6a01974400b16033ff335_522x227.png) ![](https://box.kancloud.cn/b05eab975397f68939ac4f6cc0ed315d_521x219.png) 通過查看Table類的源碼,我們可以看到支持的樣式可以包括: 樣式名|描述 ---|--- default|默認樣式 compact|沒有任何表格邊框輸出 markdown|MARKDOWN格式輸出表格 borderless|沒有左右邊框的表格輸出 box|閉合邊框輸出表格 box-double|雙線閉合邊框輸出表格 > 如果沒有指定表格樣式或者指定了一個不存在的樣式,則默認采用`default`樣式風格。 > 最后一步是渲染輸出表格,這是調用的是`Command`類封裝好的`table`方法,當然你也可以自己參考該方法實現。 ![](https://box.kancloud.cn/4fad3369607acacfeb116f822fceef49_298x52.png) 下面的代碼是`Command`類的`table`方法的實現代碼。 ![](https://box.kancloud.cn/008c3ec9e5699f3aa2847898be7b3798_402x245.png) 該方法在命令行輸出表格之后返回了渲染的表格內容,是為了便于后面寫入路由定義列表的內容到`route_list.php`文件,可以隨時查看。 有時候需要實現一個跨行跨列的輸出,例如實現一個跨列的單元格,我們在 ~~~ $table->setRows($rows); ~~~ 后面添加如下代碼: ~~~ // 跨列數據直接傳入字符串 $table->addRow('Extra Route List'); $table->addRow(['test/:name', 'index/test', '*', 'test', '']); ~~~ 現在運行指令后輸出效果如圖: ![](https://box.kancloud.cn/d97bab849e799a5a9130ef2d62056628_526x296.png) > 目前Table尚不支持跨部分列的表格輸出 ## 總結 總結下來,`Table`類的用法其實很簡單 ~~~ // 實例化一個Table對象 $table = new Table(); // 設置表頭(可選) $table->setHeader(); // 設置表格數據 $table->setRows(); // 添加單行數據(可選) $table->addRow(); // 設置表格樣式(可選) $table->setStyle(); // 渲染表格輸出 $content = $table->render(); ~~~ 其實不僅僅是用于命令行輸出,你還可以進行文件寫入的時候生成表格數據內容。
                  <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>

                              哎呀哎呀视频在线观看