作業サイトで最初からphpでORMを作成することにした方法とその結果

私は多くのプログラマーのように、自転車の作成と車輪の発明に対してかなり否定的な態度をとっています。これは、少なくともビジネスの開発コストによって正当化される以上のものです。しかし、私の経験が示しているように、時にはこのルールから逸脱しなければならず、さらにはそれから利益を得る必要があります。開発への関心と喜びだけでなく、プロジェクト全体にとってのメリットも意味します。あなたはカットの下で私の同様の経験の1つについていくつかの言葉を読むことができます。







前書き



現在のWebアプリケーションの作成方法は、スターファクトリーがテレビで放映されたとき、クラムシェルを持って歩くのがファッショナブルで、PHPがオブジェクト指向言語の兆候を獲得し始めたばかりの、古くからサポートのために提供されたコードとは大きく異なります。 2000年代のプログラミングは、ダーウィンのアイデアの優れた例のように思えます。当時、ほとんどすべての開発者が独自のソリューションを作成し、その一部は複数の人の心を捉えました。加速された自然な選択を経た後、フレームワークとCMSは、最も人気のある最良の開発方法のタイトル例になりました。 ..。それにもかかわらず、「良い」という言葉がなく、「最高」という言葉がない、人気がある場合もあります。





しかし、恐竜やマンモスとは異なり、特にバックエンドでは、すべての代替ソリューションが忘却されているわけではありません。私はこれを直接知っています。私は働く機会がありました、私はphpの大規模な、しかしかなり堅実な量の遺産で言うつもりはありません。いくつかはひどいもので、いくつかのサイトやCMSでさえかなり興味深いものでした。時々私は開拓者の心の中で生まれたものを掘り下げるのが好きです。当時はそのような標準化はありませんでした。ほとんどの場合、アンチパターンを学習するための優れた資料ですが、このコードは私を楽しませ、IT考古学に似た仕事をします。



最愛の遺産



個人的には、レガシーの作業サイトで作業するのが好きです。編集を行い、ワイルドクラッチを削除し、混乱のレベルを減らし、同時にシステム全体を壊さないようにします。そんな時、この世界を少し良くしてくれた人のように感じて、かっこいいです。



print " <button onClick='domultimove();' class=controlbutton><img src=syspix/ico32_move.gif border=0><br></button>";
print "<b>" . $ITEM->Description . "</b>:<br>";
$browsebgcolor = "#D9D9D9";
$sql = "select i.ID, m.Name, i.perm, i.descr from item4 i inner join main m on i.ID=m.ElementID";
echo "<script language='JavaScript'> document.location='" . $_SERVER['PHP_SELF']";


レガシーの一般的な機能は、さまざまな言語で記述されたコードの混乱ですが、最近の開発では、もちろん、たとえばSQLコードをPHPクラスに追加できます。しかし、私は別のことについて話している。レガシーでは、開発者の普遍的な考えの流れがしばしばある-彼が考えたものと言語で、彼は流れに書いた。私が以前から取り組んできた1つのメガオールドスクールCMSソリューションで同様の状況について話したいと思います。そこにあるすべてのものがとても「素晴らしかった」ので、何かを修正してサイトをより正確かつ高速に動作させることができてとてもうれしく思います。



そこで、2000年代前半に書かれた大企業のウェブサイトを手に入れました。このプロジェクトでは、すべてが1つのメソッドを持つクラスに基づいており、すべてが発生しました。ロジックの操作、インターフェイス(ビュー)の表示、データベースへのアクセス、さらに、コマンドの間にsqlがありました。
print "<table>";
..。ちなみに、このようなコードで実行されているサイトを、トラフィックが多く商用コンポーネントを使用して編集することは、最も楽しいイベントではありませんでしたが、非常に楽しいイベントでした。





最初にレイアウト出力をテンプレートに取り込むことで、バックエンド開発者の生活を大幅に向上させたことは想像に難くありません。このために、私は既製でかなり人気のある小枝テンプレートエンジンを使用しました。簡単で速いので、リファクタリングにあまり時間をかけませんでした。私の意見では、次のステップはデータベースへのクエリで何かをすることでした。結局のところ、MVCは私たちのWebではそれほど人気が​​ありません。





SymphonyとLaravelを見て、ORMアプローチがここでも完全に適合すると判断しました。データベースを使用して作業を実行し、当面の間、コントローラーではなく、既に受信したデータのみを使用するようにしておくと役立ちます。既存のソリューションを使用することは論理的で完全に正しいことです。そのため、まずはドクトリン以外にどんな選択肢があるのか​​、急いでパッケージギストに行きましたが、よく考えてみると、それほど重要ではないという残念な結論に至りました。重要なのは、このプロジェクトはかなり変わったデータ構造を持っていたということです。MODxで作業しましたが、他の場所ではそのようなことは見たことがありません:)問題に直面しました。人気のあるオープンソースORMを希望どおりに使用しても、うまくいきません。少なくとも、別の冒険になるでしょう。そこで、自転車を作ることにしました。



私がしたことについて少し





はい、私はこのプロジェクト専用に、PHPでORMを最初から作成することにしました(いいえ、同じDocktrineからアイデアや概念を借りました)。これにより、データ構造で機能するようになりました。結局のところ、これは作業サイトであり、「通常のデータベース構造ですべてを最初から書き直す」タスクにプログラマーのリソースを割り当てる準備ができていませんでした。このCMSを創設した祖先は、2種類のオブジェクトを作成し、そのうちの1つは内部の「データ型」にも分割されました。日付、リンク、さまざまな種類のテキスト、画像、その他のさまざまな種類のリソースが2つのテーブルに格納されていましたが、オブジェクトもありました。 1つのテーブルに格納されているので、システムデータと呼べると思います。





モデルに呼び出しを適用するときに結合について考える必要はありませんでした。少なくとも、そのような瞬間を最小限に抑えようとしました。そのため、モデルは、単一テーブルオブジェクト用と基本的な2テーブルオブジェクト用の2つのタイプにする必要があると判断しました。これらのモデルクラスには多くの共通メソッドがあり、同じORDER BYまたはLIMITがあります。したがって、各基本クラスは、具体的なモデルの作成に基づいて、一般的なAbstractクラスから継承しました。



ORM



ツリーからわかるように、さまざまなタイプのデータベースのサポートも追加しました。この場合は冗長です。しかし、その瞬間、私は「ストリーム」に入り、作成しました:)。また、この場合の非常に正しい手順は、コードで使用されているphp-mysqlがサイトを言語の7番目のバージョンに変換することを許可しなかったため、PDOに基づいて行ったことであり、彼らが言うように、これをルートで修正したかったのです。



$element = (new Model())->getOne($id);


データベースの構造のロジックをよく理解していたため、以前のアプローチで必要だった、リソースの内部データタイプがわからなくても、IDだけでリソースを検索および取得できました。実際のオブジェクトはデータを処理しますが、コード内のsqlについては忘れています。





最後の段落..。



この仕事は私に2つの予想外のターンをもたらしました。まず、すべてをコードの形で一度に書き込もうとしましたが、何も機能しませんでした。私はペンとノートを持って自然に出かけ、スズメの鳴き声と蜂の鳴き声に、最初に取得したいもの、接続方法、必要なクラス、および「コントローラー」コードでの呼び出し方法を描画する必要がありました。ちなみに、実装は元のスケッチとわずかに異なりました。したがって、プログラマーが何もコーディングしなくても、それは彼が何か有用なことをしていないという意味ではありません。



第二に、私はそれを非常に迅速に行いました。プログラマーがあらゆる種類の理解できないリファクタリングに時間を費やすとき、多くの企業はそれを嫌います。私はプロジェクト全体を約1週間以内に実装し、同時に新機能の実装タスクを実行しました。



記事の冒頭で述べた利点に注目します。作業中のプロジェクトで既存のコードを置き換える順序と段階性です。つまり、移行に時間を割く必要がなく、受信タスクのフレームワーク内でコードをリファクタリングします。これで私は私の休暇を取ります、読んでくれてありがとう。



All Articles