Wie ich mich entschied, ORM in PHP von Grund auf auf einer Arbeitsstelle zu schreiben, und was dabei herauskam

Ich habe, wie viele Programmierer, eine eher negative Einstellung gegenüber der Herstellung von Fahrrädern und der Erfindung von Rädern, und dies ist zumindest durch die Entwicklungskosten für das Unternehmen mehr als gerechtfertigt. Aber wie meine Erfahrung gezeigt hat, muss man manchmal von dieser Regel abweichen und sogar davon profitieren. Ich meine nicht nur Interesse und Freude an der Entwicklung, sondern auch Goodies für das gesamte Projekt. Sie können ein paar Worte über eine meiner ähnlichen Erfahrungen unter dem Schnitt lesen.







Einführung



Die Art und Weise, wie wir jetzt Webanwendungen erstellen, unterscheidet sich stark von dem Code, der uns zur Unterstützung aus der Antike zur Verfügung stand, als die Star Factory im Fernsehen gezeigt wurde. Es war in Mode, mit einer Clamshell zu laufen , und PHP begann gerade, Anzeichen einer objektorientierten Sprache zu erwerben. Das Programmieren in den 2000er Jahren scheint mir ein hervorragendes Beispiel für Darwins Ideen zu sein: Zu dieser Zeit entwickelte fast jeder einzelne Entwickler seine eigenen Lösungen, von denen einige die Gedanken von mehr als einer Person erregten, und nachdem sie die beschleunigte natürliche Selektion durchlaufen hatten, wurden Frameworks und CMS zu den Titelbeispielen der besten und beliebtesten Entwicklungsmethoden ... In einigen Fällen jedoch nur beliebt, ohne das Wort "gut" oder noch mehr "das Beste".





Aber im Gegensatz zu Dinosauriern und Mammuts sind nicht alle alternativen Lösungen in Vergessenheit geraten, insbesondere im Backend, und das weiß ich aus erster Hand. Ich hatte die Chance zu arbeiten, ich werde nicht mit einer großen, aber ziemlich soliden Menge an Vermächtnis in PHP sagen. Einiges davon war einfach schrecklich und einige der Websites und sogar das CMS waren ziemlich interessant. Manchmal beschäftige ich mich gerne mit dem, was in den Köpfen der Pioniere geboren wurde. Damals gab es keine solche Standardisierung, und obwohl es die meiste Zeit ein ausgezeichnetes Material zum Erlernen von Anti-Mustern ist, macht mich dieser Code amüsant und macht den Job ähnlich wie die IT-Archäologie.



Geliebtes Erbe



Persönlich arbeite ich gerne mit Legacy-Websites - um Änderungen vorzunehmen, wilde Krücken zu entfernen, das Chaos zu verringern und gleichzeitig nicht das gesamte System zu beschädigen. In solchen Momenten fühle ich mich wie eine Person, die diese Welt ein bisschen besser gemacht hat, und es ist cool.



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']";


Ein gemeinsames Merkmal von Legacy ist ein Durcheinander von Code, der in verschiedenen Sprachen geschrieben ist, obwohl wir in der modernen Entwicklung natürlich PHP-Klassen beispielsweise Code in SQL hinzufügen können. Aber ich spreche von etwas anderem, im Erbe gibt es oft einen Strom universeller Gedanken des Entwicklers - was und in welcher Sprache er dachte, schrieb er in einem Strom. Ich möchte über eine ähnliche Situation mit einer Mega-Old-School-CMS-Lösung sprechen, mit der ich seit einiger Zeit arbeite. Alles dort war so "wunderbar", dass ich nur sehr froh bin, dass ich etwas reparieren und dafür sorgen konnte, dass die Website viel korrekter und schneller funktioniert.



Also bekam ich eine Website für ein großes Unternehmen, die in der ersten Hälfte der 2000er Jahre geschrieben wurde. In diesem Projekt basierte alles auf Klassen mit einer Methode, bei der alles passierte: Arbeiten mit Logik, Anzeigen der Schnittstelle (Ansicht) und Zugreifen auf die Datenbank. Außerdem befand sich SQL genau zwischen den Befehlen
print "<table>";
... Das Bearbeiten einer Site, die mit einem solchen Code ausgeführt wird, mit gutem Datenverkehr und einer kommerziellen Komponente, war übrigens nicht das angenehmste, aber sehr unterhaltsame Ereignis.





Es ist nicht schwer zu erraten, dass ich das Leben von Backend-Entwicklern viel einfacher gemacht habe, indem ich zuerst die Layoutausgabe in Vorlagen eingefügt habe. Dafür habe ich die fertige und recht beliebte Zweigvorlagen-Engine verwendet. Es war einfach und schnell, so dass ich nicht einmal viel Zeit damit verbracht habe, es umzugestalten. Der nächste Schritt war meiner Meinung nach, etwas mit Abfragen an die Datenbank zu tun, schließlich ist MVC in unserem Web nicht umsonst so beliebt.





Nachdem ich mir Symphony und Laravel angesehen hatte, entschied ich, dass der ORM-Ansatz auch hier perfekt passen würde. Es wird hilfreich sein, Arbeiten mit der Datenbank durchzuführen und vorerst nicht an Controller zu gehen, sondern nur mit den bereits empfangenen Daten zu arbeiten. Es ist logisch und völlig korrekt, vorhandene Lösungen zu verwenden. Daher eilte ich zuerst zum Packagisten, um zu sehen, welche Alternativen ich neben der Lehre habe, aber nachdem ich sorgfältig überlegt hatte, kam ich zu dem enttäuschenden Schluss, dass es nicht so wichtig ist. Der Punkt ist, dass dieses Projekt eine eher ungewöhnliche Datenstruktur hatte. Ich habe so etwas nirgendwo anders gesehen, obwohl ich mit MODx gearbeitet habe :) Ich hatte ein Problem: Die Verwendung beliebter Open-Source-ORMs so, wie ich es möchte, wird nicht funktionieren, zumindest wird es ein weiteres Abenteuer sein. Also habe ich beschlossen, ein Fahrrad zu bauen.



Ein wenig über das, was ich getan habe





Ja, ich habe beschlossen, ein ORM in PHP von Grund auf neu zu schreiben (nein, ich hatte Ideen und Konzepte, die von demselben Docktrine ausgeliehen wurden), speziell für dieses Projekt, damit es mit der Datenstruktur funktioniert. Immerhin ist dies eine Arbeitsstelle, und niemand war bereit, die Ressourcen der Programmierer für die Aufgabe zuzuweisen, „alles mit einer normalen Datenbankstruktur von Grund auf neu zu schreiben“. Die Vorfahren, die dieses CMS gründeten, erstellten zwei Objekttypen, von denen einer auch in interne "Datentypen" unterteilt war: Ressourcen mit Datumsangaben, Links, verschiedenen Textarten, Bildern und einer Reihe anderer Typen wurden in zwei Tabellen gespeichert, es gab jedoch auch Objekte In einer Tabelle gespeichert, denke ich, dass sie als Systemdaten bezeichnet werden können.





Ich wollte nicht über Joins nachdenken müssen, wenn ich Anrufe an Models anwende, oder zumindest versuchen, solche Momente auf ein Minimum zu reduzieren. Daher habe ich beschlossen, dass die Modelle zwei Typen haben sollten: für Objekte mit einer Tabelle und für einfache Objekte mit zwei Tabellen. Da diese Modellklassen viele gemeinsame Methoden haben, die gleiche ORDER BY oder LIMIT, erbte ich daher jede Basisklasse, auf deren Grundlage konkrete Modelle erstellt werden, von der allgemeinen Abstract-Klasse.



ORM



Wie Sie in der Baumstruktur sehen können, habe ich auch Unterstützung für verschiedene Arten von Datenbanken hinzugefügt, was in diesem Fall redundant ist. Aber in diesem Moment habe ich den "Stream" eingegeben und erstellt :). Der sehr korrekte Schritt in diesem Fall war auch, dass ich es auf der Basis von PDO gemacht habe, weil die im Code verwendete PHP-MySQL die Übersetzung der Site in die siebte Version der Sprache nicht erlaubte, und ich wollte dies an der Wurzel beheben, wie sie sagen.



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


Aufgrund der Tatsache, dass ich die Logik der Struktur der Datenbank gut verstanden hatte, konnte ich eine Ressource nur anhand ihrer ID suchen und abrufen, ohne zu wissen, welchen internen Datentyp die Ressource hat, was beim alten Ansatz erforderlich war. Echte Objekte arbeiten mit Daten, und wir vergessen SQL im Code.





Letzte Absätze ...



Diese Arbeit brachte mir 2 unerwartete Wendungen. Zuerst habe ich versucht, alles auf einmal in Form von Code zu schreiben, und nichts hat funktioniert. Ich musste einen Stift, ein Notizbuch nehmen, in die Natur gehen und zum Zwitschern der Spatzen und zum Summen der Bienen zuerst zeichnen, was ich bekommen möchte, wie es verbunden wird, welche Klassen ich brauche und wie es im Code der „Controller“ genannt wird. Die Implementierung unterschied sich übrigens nur geringfügig von den ursprünglichen Skizzen. Wenn ein Programmierer also nichts codiert, bedeutet dies nicht, dass er nichts Nützliches tut.



Zweitens habe ich es sehr schnell gemacht, viele Unternehmen mögen es nicht, wenn Programmierer Zeit mit allen möglichen unverständlichen Refactorings verbringen. Ich habe das gesamte Projekt innerhalb von ungefähr einer Woche implementiert und gleichzeitig die Aufgaben für die Implementierung neuer Funktionen erledigt.



Ich werde auf die Vorteile eingehen, die ich am Anfang des Artikels angegeben habe: die Reihenfolge und die schrittweise Ersetzung des vorhandenen Codes in einem Arbeitsprojekt, was bedeutet, dass nicht mehr Zeit für den Übergang vorgesehen werden muss, um den Code im Rahmen eingehender Aufgaben neu zu gestalten. Dazu verabschiede ich mich, danke fürs Lesen.



All Articles