做一些研究,我发现,Yii证明是最好的框架之一.
有可能以纯粹的PHP项目迁移到Yii吗?
那么怎么办呢?我应该遵循哪些步骤来减少工作量并享受Yii框架所带来的好处?
我是一个总Yii新手,任何见解赞赏.
Rant ..
“框架”不是一个魔术酱,你添加到一个项目,使它更好更聪明.
Doing some research i found Yii turns out to be one of the best frameworks out there.
你做了什么奇怪的研究..我很想看看材料.特别是,因为我将它列为第三糟糕的PHP框架.只有通过CodeIgniter和CakePHP才能超越它的可怕性.
其原因是这个框架显示的非常糟糕的代码质量,结合不良做法,它永久存在.
为什么要避免迁移?
从你的描述很明显,你不熟悉这个框架,没有以前的经验.
在项目管理方面有一个主题:risk management.在这种情况下,在项目的最后阶段添加以前未使用的框架将构成高风险的概率,这也是由于项目的缘故,完全没有意义.
这意味着有一个很好的机会会出现问题.而如果这样做,很可能会使项目沉没.或者至少将发布数据推回相当长的时间.
在完美的世界框架中,为了简化开发的重复任务,以牺牲一些性能为代价.这些是您在项目开始时所做的任务.你不是在一个项目的开始.这意味着你不会从这个“机动”中获益.
为什么不是Yii?
正如我之前所说,还有一个原因,不仅是为了避免向现有项目添加框架,而且还有为什么特别避免Yii的原因.
继承噩梦
所有您的控制器将扩展CController
,延长CComponent
CComponent
所有您的“型号”将延伸CActiveRecord
或CFormModel
,延伸CModel
,延伸CComponent
.
这两个链都包含静态变量,并在许多不同的其他类上执行静态方法.这些因素的结合将使调试变得非常困难和繁琐.
全球状态
有几种形式的全球国家. PHP中的人通常知道的是全局变量.但这不是唯一的形式.每当你有一个包含一个静态变量的类,它也会创建一个全局状态,它可以(并且几乎总是会)会导致看似无关的实例神秘地进行交互.
全球国家的使用是核心技术.您将在代码库中看到静态调用,Yii的configuration file将不会在没有全局状态的情况下运行.
每次你打电话Yii::app()
你正在访问和/或更改它.
这使得Yii应用程序无法进行单元测试.并且调试在整个项目中变成运用grep.
紧耦合
在Yii中创建应用程序时.它变得必然.您不能执行部分应用程序,而不启动完整的框架.主要是由于静态调用,最终添加到您的代码.
每次在你自己的代码中添加一个静态调用,这段代码就会被绑定到类的名字.这基本上是紧耦合.
正如您可能已经注意到(希望),还有另一种方式如何实现相同的效果 – 使用新的操作符.这是将你的一些代码与某个类的特定名称相结合的另一种方式.
没有接口..没有..无论如何
无论Yii项目的配置如何恐怖,配置文件都是一个很好的手势.引入外部代码和替换现有组件的方式最为有害的方式就是这样搞乱了代码库.
但不幸的是,它引起了缺乏接口和现有耦合所造成的问题.
开发人员将尝试替换的组件之一是CUrlManager
.主要是由于您如何传递其他参数.
OOP中的接口指定两个实例之间的合同.它允许您定义实例的功能,可供其他人使用的方法.当它不在那里时,在一个大的代码库中,你会被猜测,哪些方法是必需的,哪些不是.
在Yii组件的情况下,由于静态调用和深度继承,问题更加复杂.上面提到的CUrlManager扩展了CApplicationComponent
,扩展了CComponent
.同样的文件定义了CUrlRule和CBaseUrlRule类.
在编写替换文件时,必须编写一些代码,将其插入到配置中,然后通过运行应用程序进行测试.这样你就可以知道接下来需要添加的方法(或参数).
基本上,这是发展的“保存一见眼泪”的方法.
那不是MVC!
Yii不实现MVC或任何MVC启发的设计模式.所谓的“MVC”可以描述为ActiveRecord-Template-Logic模式.
而不是有适当的模型层(是的,它应该是一个层),Yii的创建者选择收集active record并形成包装器.这迫使应用程序逻辑被强制在“控制器”中.
另一方面,您已经荣耀了模板,而不是用于包含演示逻辑的正确视图实例.使用widgets有一些缓解,但是这些因素却遭受了SRP的违规行为,因为小部件被强制包含一些表示逻辑并执行部分渲染.演示逻辑的其余部分在控制器中再次出现.
而更糟糕的是,“控制器”也必须处理authorization.这通常意味着,当您更改访问方案时,您将不得不通过CController的每个实例来检查是否需要更改太.
这不是MVC.这是一个混乱的名字从MVC设计模式和拍打一些组件.
所有的小事情 ..
该框架也附有一些小问题,不配有单独的部分:
>每个文件定义一个类:
这将会令人讨厌相当快,因为在类文件中将会有完全不相关文件名的类.这意味着,调试通常需要使用搜索.
>打开“模块”:
通过它的外观,modules之后添加到框架后的事实.这就是为什么,当您需要设置默认模块时,您将必须将其设置在配置文件参数中,即“defaultController”.