株式会社スマレジの開発部でスマレジのサーバサイドを作っています

Lucid ChartからLaravelのrouteのひな形を生成する(1)

こんにちは、株式会社スマレジ、エンジニアのmasaです。

今日は以前から作っているLucid Chart APIの矩形データ読み込みを使って、Laravelのrouteファイルのひな形を生成したいと思います。

 前回のブログ↓

masa2019.hatenablog.com

Laravel6.xのroute機能

readouble.com

基本的なことは↑の公式ドキュメントで確認してください。 このシリーズでは特に↓のような

Route::get('/user', 'UserController@index');

http_methodとコントローラ、アクション、パラメータの指定までを生成したいと思います。 今回は取り急ぎの仕様と、前準備としてHTTP_METHODをページ情報に紐づけるところまでをやります。

Lucid Chartで作成する画面遷移図の仕様

今回は一番簡単な「テーブルから必要情報を抜き出して、ファイルを生成する」ことを考えます。 以前のブログでも使用した↓のテーブルが1つの画面だと考えます。 f:id:masa2019:20191222182119p:plain

でHTTP_METHODについては、矢印側で表現するようにします。

f:id:masa2019:20200113000834p:plain
遷移図の例

矢印情報からページのHTTP_METHODを取得する。

過去ブログ(↓)でも記載したように、Lucid Chartでは矢印情報に矢印の形(矢じりなのか、何もないのか等)と始点と終点の矩形のIDが付与されています。 masa2019.hatenablog.com

なので、「矢印の形が矢じりであり、IDが一致する場合の矢印のtext」を取得し、テーブル情報に追加する処理を追記します。 HTTP_METHODは一つのURLに複数定義できるので、今回は

[
  [ "HTTP_METHOD", "GET"],
  [ "HTTP_METHOD", "POST"],
  [ "HTTP_METHOD", "DELETE"]
]

という風にセットするようにします。(カンマ区切りで連結してもよいかと)

HTTP_METHODの取得処理は↓のような感じ

   /**
     * 矢印情報からそのページに必要なHTTP_METHODを取得する
     * @param \SimpleXMLElement $block ページ情報
     * @return array|bool 該当するmethodがあれば
     */
    private function getAllowHttpMethod(\SimpleXMLElement $block) {
        $lines = $this->getLines();
        $blockArray = (array)$block;
        $blockId = Arr::get($blockArray, 'id');
        if (blank($blockId)) {
            return false;
        }
        foreach($lines as $key => $line) {
            $lineArray = (array)$line;
            $endpoint1 = Arr::get($lineArray, 'endpoint1');
            $endpoint1Array = (array)$endpoint1;
            $endpoint2 = Arr::get($lineArray, 'endpoint2');
            $endpoint2Array = (array)$endpoint2;
            //矢印の矢(Arrow)側のIDを取得
            if (Arr::get($endpoint1Array, 'style') == "Arrow") {
                $lineId = Arr::get($endpoint1Array, 'block');
            } elseif (Arr::get($endpoint2Array, 'style') == "Arrow") {
                $lineId = Arr::get($endpoint2Array, 'block');
            } else {
                $lineId = "";
            }
            //IDが一致していたら、矢印のHTTP_METHODを登録
            if ($lineId == $blockId) {
                $httpMethod = strtoupper(Arr::get($lineArray, 'text'));
                $httpMethodArray = ["POST", "PUT", "GET", "DELETE", "PATCH", "OPTION"];
                if (array_search($httpMethod, $httpMethodArray) != false) {
                    return [
                        "HTTP_METHOD",
                        strtoupper(Arr::get($lineArray, 'text')),
                    ];
                }
                $this->setErrorInfo("http_method string is wrong.");
                break;
            }
        }
        return false;
    }

これを↓のところで呼ぶ。

    /**
     * ページ情報配列を作成
     * @return array
     */
    public function getTableInfos() {
       $blocks = $this->getBlocks();
       $pageInfos = [];
       foreach ($blocks as $block) {
           $aryInfo = (array)$block;
           if (!in_array($aryInfo["class"],self::LUCID_TABLE_CLASS_LIST, true)) {
               //テーブル以外はスキップ
               continue;
           }
+           $pageInfo = $this->getTableInfo($block);
+           $allowHttpMethod = $this->getAllowHttpMethod($block);
+           if (is_array($allowHttpMethod)) {
+               $pageInfo[] = $allowHttpMethod;
+           }
+           $pageInfos[] = $pageInfo;

       }
       return $pageInfos;
    }

これで、getTableInfos()でえられるページ情報が下記のような感じに。

f:id:masa2019:20200113013507p:plain
HTTP_METHODを追加

ひとまず、これで最低限のrouteを書く情報はそろいました。 正規表現への対応とか、LaravelのRouteの機能はまだまだありますが、それは骨を作ってから拡張していく方向で考えています。