我决定如何在工作站点上从头开始用php写ORM,以及它的来龙去脉

与许多程序员一样,我对自行车的创造和车轮的发明持相当消极的态度,这至少在为企业发展的成本上是合理的。但是,正如我的经验所表明的那样,有时您必须偏离此规则,甚至可以从中受益。我的意思是不仅对开发感兴趣和感到高兴,而且对整个项目来说都是好东西。您可以阅读有关我的类似经历之一的一些话。







介绍



现在,我们创建Web应用程序的方式与从远古时代获得支持的代码截然不同。当电视上播放《星际工厂》(Star Factory)时,翻盖式翻盖很时髦,而PHP才刚刚开始获得面向对象语言的标志。在我看来,2000年代的编程似乎很好地说明了达尔文的想法:当时,几乎任何一个开发人员都创建了自己的解决方案,其中一些吸引了超过一个人的想法,在经过加速的自然选择之后,框架和CMS成为最好和最受欢迎的开发方法的标题示例...然而,在某些情况下,仅流行,没有“好”一词,甚至更没有“最好”一词。





但是,与恐龙和猛mm象不同,并不是所有替代解决方案都被遗忘了,尤其是在后端,我是第一手知道的。我有机会工作,我不会在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']";


遗留的一个共同特征是,用不同语言编写的代码混乱不堪,尽管在现代开发中,我们当然可以在PHP类中添加SQL代码。但是我说的是其他事情,在传统上,开发人员通常会产生一连串的普遍想法,即他以一种什么样的语言写的东西。我想谈一谈我已经使用了一段时间的大型老式CMS解决方案的类似情况。那里的一切都“很棒”,我很高兴能够修复某些问题并使网站更正确,更快地工作。



因此,我有一家大型公司的网站,写于2000年代上半年。在这个项目中,一切都基于一种方法的类,其中发生了一切:使用逻辑,显示界面(视图)并访问数据库,此外,在命令之间还有sql
print "<table>";
...顺便说一下,以良好的访问量和商业组件对使用这种代码运行的网站进行编辑并不是最令人愉快的事情,而是非常有趣的事情。





不难猜测,我通过首先将布局输出引入模板极大地促进了后端开发人员的生活。为此,我使用了现成且颇受欢迎的树枝模板引擎。它既简单又快速,所以我什至没有花很多时间进行重构。在我看来,下一步是对数据库进行查询,毕竟,MVC在我们的网络中并不流行。





在研究了Symphony和Laravel之后,我认为ORM方法也非常适合这里。这将有助于进行数据库工作,暂时让非控制器仅处理已接收的数据。使用现有解决方案是合乎逻辑的并且完全正确。因此,首先,我赶紧去包装主义者,看看我除了教义之外还有什么选择,但是经过仔细的思考,我得出了令人失望的结论,即它并不那么重要。关键是该项目具有非常不寻常的数据结构。尽管我与MODx一起工作,但我在其他任何地方都没有看到这样的事情:)我遇到了一个问题:使用流行的开源ORM不能以我想要的方式使用,至少,这将是另一种冒险。因此,我决定制造一辆自行车。



关于我的所作所为





是的,我决定专门为该项目从头开始用PHP编写ORM(不,好,我的想法和概念是从同一个Docktrine借来的),以便它可以与数据结构一起使用。毕竟,这是一个工作站点,没有人准备分配程序员的资源来完成“用正常的数据库结构从头重写一切”的任务。创建此CMS的祖先创建了两种类型的对象,其中一种也被划分为内部“数据类型”:具有日期,链接,不同类型的文本,图像和许多其他类型的资源存储在2个表中,但是还存在对象存储在一张表中,我认为它们可以称为系统数据。





在对模型应用调用时,我不想考虑联接,或者至少尝试将这种情况减少到最少。因此,我决定模型应为两种类型:用于单表对象和用于基本两表对象。由于这些Model类具有许多通用方法,因此每个基类都具有相同的ORDER BY或LIMIT,因此将根据其创建具体的Model,我从通用Abstract类继承。



ORM



从树上可以看到,我还添加了对不同类型数据库的支持,在这种情况下这是多余的。但是在那一刻,我进入了“流”并创建了:)。同样,在这种情况下最正确的步骤是我基于PDO进行了此操作,因为代码中使用的php-mysql不允许将该站点转换为该语言的第七个版本,并且我想像他们所说的那样从根本上修复它。



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


由于我对数据库结构的逻辑有很好的了解,因此我仅能通过其ID搜索和检索资源,甚至不知道资源具有哪种内部数据类型,而这是旧方法所必需的。实际对象处理数据,而我们在代码中忘记了sql。





最后几段...



这项工作为我带来了2个意外的转折。首先,我试图以代码形式一次编写所有内容,但没有任何效果。我不得不拿笔,一个笔记本,走进大自然,为了麻雀的鸣叫和蜜蜂的嗡嗡声,首先画出我想要得到的东西,它如何连接,我需要什么类以及如何在“控制器”代码中调用它。顺便说一句,然后实现与原始草图仅稍有不同。因此,如果程序员不编写任何代码,并不表示他没有做任何有用的事情。



其次,我很快就做到了,当程序员将时间花在各种难以理解的重构上时,许多企业都不喜欢它。我在大约一周的时间内完成了整个项目,同时完成了实现新功能的任务。



我将注意到我在文章开头提到的那些优点:在工作项目中替换现有代码的顺序和渐进性,这意味着无需分配更多时间进行过渡,而是在传入任务的框架内重构代码。在此,我请假,谢谢您的阅读。



All Articles