新年あけちゃいました…。

一筋縄ではいかないconvert

同じPHP、ベタ打ちからLaravelへのコンバートなんて簡単だろうと思っていたら...。

結構大変ですね。

年内に構築終わると思っていたのが大誤算です。

今回はコンバートで労力がかかっているポイントを整理してみたいと思います。

最大の難所は命名規制

結局、コンバート最大の敵はこの命名規制でした。

既に作成しているベタ打ちPHPではテーブル名を長くしたくなかったため独自の省略名称を利用していました。
これは、SQLを書く時に(長くない方が)煩雑にならない為だったのですが、Laravelでは単語の単数形/複数形の記載分けが出てくるため、そのまま利用できないことが多々ありました。
そこで、テーブル名やカラム名(特に参照先ID)をほぼ全て作り変える事となり、旧システムのSQLをすべて変えないといけない事態が発生。
ほぼセロベースで打ち込みとなりました。

ただ、命名規制を優先しないと旧システムの弱点と指摘された【セキュリティ】は課題を抱えたままとなりますし、変更修正を念頭に入れた設計とはなりません。

やはりコンバートには【ルール順守】のポリシーが必要なのだと感じています。

ビューのblade対応

次点はBladeへの対応です。

ベタ打ちシステムではPHP内にHTMLを書き込む感覚で作成していました。こんな感じです。

<?PHP
 echo "<center>";
require_once $p . 'conecter/access_sakura_hjjs.php'; //MYSQL ログイン

    try{
    if(empty($_GET['id'])) throw new Exception('name不正');
    $id = $_GET['id'];
    $sql = "SELECT 
            supplier_i_code,
            f_adoption,
            PRO_ID,
            product_name,
            supplier_code,
            cost,
            JAN,
            ItemState,
            DeliveryDate,
            up_date 
            From SSG_solo 
            where supplier_i_code = :id";
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':id', $id, PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if($id != $result[0]['supplier_i_code']){
        echo '<META http-equiv="Refresh" content="0;';
        echo 'URL=' . $r . 'selectqr.php?id=' . $id . '&fd=_ti_ite/new&sd=n_j0">';
        }
    
    } catch (Exception $e) {
    echo "クエリ取り出しエラー: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'utf-8') . "<br>";
    die();
    echo '<hr><a href="' . $r . 'sys/index.php">トップページに戻る</a><br>';
}
?>

<h4>商品個別情報</h4>
<hr>
<form method="post" action="<?php echo $r; ?>selectqr.php?id=<?php echo htmlspecialchars($result[0]['supplier_i_code'], ENT_QUOTES, 'UTF-8');?>&fd=_ti_ite/up&sd=up_i0">
<table><tr><td> <!-- コンテンツ全体を囲うテーブル -->
    <p>
    <table align =right>
        <tr>
            <th>取扱状態</th>
                <?php
                echo '<td>';
                $de = htmlspecialchars($result[0]['ItemState'], ENT_QUOTES, 'UTF-8');
                require_once ($p . 'functions/f_pull-down.php'); //functionリスト配置
                    disp_i_status('ItemState',$de); //リストの取り出し
                echo '</td>';
                ?>
            <th> 採用可否</th>
                <?php
                echo '<td>';
                require_once ($p . 'functions/f_pull-down.php'); //functionリスト配置
                    disp_switch($result,'f_adoption'); //リストの取り出し
                echo '</td>';
                ?>
        </tr>
    </table>
    </p><br><br><hr>
    <p align="left">■仕入先固有情報</p>
    <table>
        <tr>
            <th>仕入先商品管理番号</th>
            <td><input type="text" name="supplier_i_code" value="<?php echo htmlspecialchars($result[0]['supplier_i_code'], ENT_QUOTES, 'UTF-8'); ?>"></td>
            <th>仕入先コード</th>
                <?php
                echo '<td>';
                $de = htmlspecialchars($result[0]['supplier_code'], ENT_QUOTES, 'UTF-8');
                require_once ($p . 'functions/f_pull-down.php'); //functionリスト配置
                    disp_lg('supplier_code',''); //リストの取り出し
                echo ' </td>';
                ?>
        </tr>
    </table>
    <hr>
    <p align="left">■選択商品</p>
    <table>
        <tr>
            <th>メーカー商品コード</th>
            <td><input type="text" name="PRO_ID" value="<?php echo htmlspecialchars($result[0]['PRO_ID'], ENT_QUOTES, 'UTF-8'); ?>"> </td>
            <td></td><td></td>
        </tr>
        <tr>
            <th>JANコード</th>
            <td><input type="text" name="JAN" value="<?php echo htmlspecialchars($result[0]['JAN'], ENT_QUOTES, 'UTF-8'); ?>"></td>
            <td></td><td></td>
        </tr>
    </table>
<hr>
    <p align="left">■登録価格情報</p>
    <table>
        <tr>
            <th>仕入れ値</th>
            <td><input type="text" name="cost" value="<?php echo htmlspecialchars($result[0]['cost'], ENT_QUOTES, 'UTF-8'); ?>"></td>
        </tr>
    </table>
</form>
    <hr>

特に、HTMLパート内で出てくる<?PHP echo 変数 ;?>は都度echoを書く仕様なため面倒ですし、読み込むファイル毎にSQLを構築するという手間の多さも感じていました。

ここはMVCモデルのいいところで、SQLはmodelにある為、修正時に何か所も訂正する必要が無い強みがうれしかったです。

ただし、書き方が丸々変わるのでコンバートというよりゼロベースで書く事になります。
まぁ管理は楽になるのでしょうがないですね。

SQLのEloquant化

技術的に悩んだのがEloquantです。

いや、今でも悩みますね。「なんで値を取ってこないんだよ!」なんてことがまだあります。

1つのテーブルだけで済むものであればいいのですが、3つのテーブルのリレーションとか複雑さが増すとやはり直接SQLを組む方が楽です。
これは慣れなのでしょうけど、悩みます。

最大の利点は整理整頓

セキュリティーの脆弱性をつかれLaravelへのコンバートをするに至ったのですが、やってみて、最大のメリットは整理整頓だと感じています。

旧来のベタ打ちの場合、ファイルごとにリレーションが組まれます。
リレーションだけ取り出して require_once で呼び出す事も可能ですが、変数で値を可変させようとした場合は直接記載するのが定番です。
設計仕様変更でカラム名に変更があったり、1カラム減ったりなんかあった時には、影響するすべてのファイルを修正しなくてはいけません。
ファイルが煩雑に管理されてるとこの『全てを修正』の難易度が跳ね上がります。

Laravelをはじめ、MVCモデルではViewのファイルまで命名規制に含まれたりとルールが整理整頓を促してくれます。

まとめ

自由はいい事ですけど、自由過ぎると結局まとまらない。
そんないい例かもしれませんね。

年内に作り終えようと考えていたシステムは完成がだいぶ遅れる事となりますが、妥協することなく良いものを作っていきたいと思います。

それでは、本年もよろしくお願いいたします。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください