use*_*266 9 php frameworks yii
我几乎完成了一个PHP项目,使用MVC,jQuery和Ajax.这是纯PHP项目.我不知道代码中的任何框架.我想改变这一点.我发现,进行一些研究,结果证明Yii是最好的框架之一.
有可能以某种方式将纯PHP项目迁移到Yii吗?
如果是这样,那该怎么办?我应该遵循哪些步骤来减少工作量并享受Yii框架带来的好处?
我是Yii新手,任何见解都很受欢迎.
ter*_*ško 47
TL; DR:不要这样做.这是一个非常可怕的想法.
做一些研究我发现Yii是最好的框架之一.
你做了多么奇怪的研究......我很想看到材料.特别是,因为我将它列为第三差的PHP框架.只有CodeIgniter和CakePHP才能超越它的可怕性.
其原因是代码质量极差,这个框架显示出来,并结合不良实践,它会延续下去.
从您的描述中可以明显看出,您并不熟悉此框架,也没有以前的经验.
在项目管理中有一个主题:风险管理.在这种情况下,在项目的最后阶段添加以前未使用的框架将构成高概率和高影响风险,由于项目的圣人,这种风险也完全没有减轻.
这意味着很有可能出现问题.当它发生时,它很可能会沉没项目.或者至少在相当长的时间内推迟发布数据.
在完美的世界中,框架用于简化开发的重复性任务,但代价是性能.这些是您在项目开始时执行的任务.你不是一个项目的开始.这意味着您将无法从这种"机动"中获益.
正如我之前提到的,不仅有理由避免向现有项目添加框架,还有为什么要特别避免使用Yii的原因.
所有控制器都将扩展类CController,扩展CBaseController,扩展CComponent
你的所有"模型"都会扩展以太,CActiveRecord或CFormModel扩展CModel,扩展CComponent.
这两个链都包含静态变量,并在众多不同的其他类上执行静态方法.这些因素的结合将使调试变得极其困难和繁琐.
有几种形式的全球国家.PHP中的人通常知道的是global变量.但这不是唯一的形式.每当你有一个包含static变量的类时,它也会创建一个全局状态,它可以(并且几乎总是会)导致看似无关的实例神秘地交互.
使用全球状态是核心机制.您将在整个代码库中看到静态调用,如果没有全局状态,Yii的配置文件将无法运行.
每次打电话给Yii::app()你都在访问和/或更改它.
这使得Yii应用程序无法进行单元测试.调试变成了grep对整个项目的使用.
在Yii中创建应用程序时.它受到约束.如果不启动完整框架,则无法执行应用程序的某些部分.主要是由于静态调用,您最终添加到您的代码.
每次在自己的代码中添加静态调用时,该段代码都会与类的名称相关联.这基本上是紧耦合.
正如您可能已经注意到的那样(希望如此),还有另一种方法可以实现相同的效果 - 使用new运算符.这是将您的某些代码耦合到类的特定名称的另一种方法.
无论Yii项目的配置多么糟糕,配置文件都是一个很好的手势.在如此混乱的代码库中引入外部代码并替换现有组件的最不有害的方法.
但不幸的是,它引起了由缺乏接口和现有耦合引起的问题.
开发人员将尝试替换的组件之一是CUrlManager.主要是因为您可以传递其他参数的方式.
OOP中的接口指定两个实例之间的契约.它允许您定义实例的功能,以及其他人可以使用的方法.当它不存在时,在大型代码库中,您需要猜测,哪些方法是必需的,哪些方法不是.
在Yii组件的情况下,由于静态调用和深度继承,问题进一步复杂化.上述CUrlManager延伸CApplicationComponent,延伸CComponent.同样的文件定义CUrlRule和CBaseUrlRule类.
在编写替换时,必须编写一些代码,将其插入配置中,然后通过运行应用程序对其进行测试.这样您就知道接下来需要添加哪个方法(或参数).
基本上,这是"拯救一个看起来爆炸"的发展方法.
Yii没有实现MVC或任何MVC启发的设计模式.它所谓的"MVC"可以被描述为ActiveRecord-Template-Logic模式.
Yii的创建者没有选择合适的模型层(是的,它应该是一个层),而是选择了活动记录和表单包装器的集合.这迫使应用程序逻辑强制进入"控制器".
另一方面,您已经获得了模板,而不是用于包含表示逻辑的正确视图实例.通过使用小部件可以稍微减轻它,但是这些小部件遭受SRP违规,因为小部件被强制包含一些表示逻辑并执行部分呈现.其余的表示逻辑在控制器中再次出现.
更糟糕的是,"控制器"也必须处理授权.这通常意味着,无论何时更改访问方案,您都必须遍历每个实例CController以检查是否需要更改.
这不是MVC.从MVC设计模式中获取的名称和一些组件上的名字都是混乱的.
该框架还有一些小问题,不值得单独的部分:
为每个文件定义多个类:
这会很快变得烦人,因为在类文件中会有类似于完全不相关的文件名的类.这意味着,调试通常需要使用搜索.
陷入"模块":
从它的外观来看,模块在事后添加到框架中.这就是为什么,当您需要设置默认模块时,您必须在配置文件参数中设置它,即调用它'defaultController'.
我不知道有什么快速的解决方案。这取决于代码是如何编写的。你有数据库和你的视图,所以当你进入 yii 时,它并不是一个真正的完整的新项目。Yii 将为您生成数据库模型。您已经拥有现有项目的视图。编写控制器和操作,并根据需要修改视图。
尝试这些链接,因为它们提到了相同的问题。