将纯PHP项目迁移到Yii框架

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?

正如我之前提到的,不仅有理由避免向现有项目添加框架,还有为什么要特别避免使用Yii的原因.

继承的噩梦

所有控制器都将扩展类CController,扩展CBaseController,扩展CComponent

你的所有"模型"都会扩展以太,CActiveRecordCFormModel扩展CModel,扩展CComponent.

这两个链都包含静态变量,并在众多不同的其他类上执行静态方法.这些因素的结合将使调试变得极其困难和繁琐.

全球状态

有几种形式的全球国家.PHP中的人通常知道的是global变量.但这不是唯一的形式.每当你有一个包含static变量的类时,它也会创建一个全局状态,它可以(并且几乎总是会)导致看似无关的实例神秘地交互.

使用全球状态是核心机制.您将在整个代码库中看到静态调用,如果没有全局状态,Yii的配置文件将无法运行.

每次打电话给Yii::app()你都在访问和/或更改它.

这使得Yii应用程序无法进行单元测试.调试变成了grep对整个项目的使用.

紧耦合

在Yii中创建应用程序时.它受到约束.如果不启动完整框架,则无法执行应用程序的某些部分.主要是由于静态调用,您最终添加到您的代码.

每次在自己的代码中添加静态调用时,该段代码都会与名称相关联.这基本上是紧耦合.

正如您可能已经注意到的那样(希望如此),还有另一种方法可以实现相同的效果 - 使用new运算符.这是将您的某些代码耦合到类的特定名称的另一种方法.

没有接口......没有......无论如何

无论Yii项目的配置多么糟糕,配置文件都是一个很好的手势.在如此混乱的代码库中引入外部代码并替换现有组件的最不有害的方法.

但不幸的是,它引起了由缺乏接口和现有耦合引起的问题.

开发人员将尝试替换的组件之一是CUrlManager.主要是因为您可以传递其他参数的方式.

OOP中的接口指定两个实例之间的契约.它允许您定义实例的功能,以及其他人可以使用的方法.当它不存在时,在大型代码库中,您需要猜测,哪些方法是必需的,哪些方法不是.

在Yii组件的情况下,由于静态调用和深度继承,问题进一步复杂化.上述CUrlManager延伸CApplicationComponent,延伸CComponent.同样的文件定义CUrlRuleCBaseUrlRule类.

在编写替换时,必须编写一些代码,将其插入配置中,然后通过运行应用程序对其进行测试.这样您就知道接下来需要添加哪个方法(或参数).

基本上,这是"拯救一个看起来爆炸"的发展方法.

那不是MVC!

Yii没有实现MVC或任何MVC启发的设计模式.它所谓的"MVC"可以被描述为ActiveRecord-Template-Logic模式.

Yii的创建者没有选择合适的模型层(是的,它应该是一个层),而是选择了活动记录和表单包装器的集合.这迫使应用程序逻辑强制进入"控制器".

另一方面,您已经获得了模板,而不是用于包含表示逻辑的正确视图实例.通过使用小部件可以稍微减轻它,但是这些小部件遭受SRP违规,因为小部件被强制包含一些表示逻辑并执行部分呈现.其余的表示逻辑在控制器中再次出现.

更糟糕的是,"控制器"也必须处理授权.这通常意味着,无论何时更改访问方案,您都必须遍历每个实例CController以检查是否需要更改.

这不是MVC.从MVC设计模式中获取的名称和一些组件上的名字都是混乱的.

所有的小事情 ..

该框架还有一些小问题,不值得单独的部分:

  • 为每个文件定义多个类:

    这会很快变得烦人,因为在类文件中会有类似于完全不相关的文件名的类.这意味着,调试通常需要使用搜索.

  • 陷入"模块":

    从它的外观来看,模块在事后添加到框架中.这就是为什么,当您需要设置默认模块时,您必须在配置文件参数中设置它,即调用它'defaultController'.

  • @ Pentium10,在MVC中视图不是模板,模型不是ORM,控制器不负责将数据从模型传递到视图.**它不是MVC.**当代码库实际上在全局状态和紧耦合上运行时,你怎么能说它是"最好的"之一.你有没有尝试过更换Yii的核心课程?!这是一场噩梦.什么是"OOP标准APP"?! (22认同)
  • @tereško我不同意你的看法.Yii是MVC框架并且是最好的之一,它不是OOP标准APP,显然很难编码,没有人会选择这样.Yii是一个快速的应用程序开发框架,就是这样. (12认同)
  • @tacone,也许在某些情况下Symfony2/Silex(尽管他们有DIC作为核心结构,我认为它是反模式),但这一切都取决于具体要求.目前所有的PHP框架都很糟糕.诀窍是找到一个适合你的确切情况的小恶魔.如果你甚至需要一个框架,那就是. (6认同)
  • @sidtj,做了一些更新,但是,如果你想研究OOP及相关的实践和原则,我建议你通过[这个列表](http://stackoverflow.com/a/16356866/727208). (5认同)
  • 非常翔实.有没有你推荐的PHP框架? (4认同)
  • 相信我,包括羌在内的所有核心团队都非常了解SOLID和模式.我们不是狂热分子,我们不是试图让理论上的所有东西"正确",而是在API简单性,性能和形式正确性之间保持良好的平衡. (4认同)
  • @Rokk,当我写"难以替换核心类"时,我的意思是没有接口,所有变量都是公共的,一半的方法都是静态的.在全局配置中覆盖它们之后,您必须运行所有内容,以查看在某处使用了哪些公共变量和静态方法.没有办法事先知道,你需要在课堂上有什么才能成为替代者. (4认同)
  • 是的,我试图替换Yii中的核心类,有一个数组,您可以在其中定义自己的覆盖. (3认同)
  • @tereško,拜托,您能否更好地解释一下自己,给我们一些"全局状态","紧密耦合","视图模板"和"非单元测试检查"的实例?如果你能做到,我将非常感激,因为我喜欢提高我对设计原理(GRASP)的了解.谢谢. (3认同)
  • @tereško我也不得不就某些问题发表意见.从最严格的意义上讲,它不是MVC.虽然对于网站,您如何创建严格的MVC框架.MVC解决所有问题的想法也不正确.您忘记它的一个主要优点是超高速,根据我的经验,某种结构比没有结构更好.我会说Symphony2是最大的竞争者,但也存在问题.因此,最好的解决方案是使用最适合您情况的解决方案. (3认同)
  • @Tixel你究竟对此不以为然?我提到MVC**只是因为Yii将它命名为它的主要特征..因为它对MVC的*解释*实际上是"activeRecord-logic-template"(它破坏了SoC两次),似乎它们在于他们的营销(哦...... watta惊喜).我究竟在哪里说MVC解决了所有问题?我想知道,你是怎么得出它"超高速"的结论的? (3认同)
  • @tereško好的,当市场营销人员告诉真实的故事时,无论如何,这不是一个不使用东西的正当理由.与Symfony2和Zend等严重依赖缓存的企业框架相比,Yii out执行它们.我并不是说这是最好的,但绝对是一个有力的竞争者.那么你对这些问题的大肆宣传,还有什么选择呢?原始的PHP有更多的问题,你可能做错了.考虑到框架的所有这些,PHP本身就存在问题.我确实同意你指出的一些问题,但也有一些功能使它也很好. (3认同)
  • 单元测试Yii应用程序不可能的事实也不是真的.Yii项目是完全可调试的.有框架本身的测试:https://github.com/yiisoft/yii/tree/master/tests,您可以为您的应用程序编写单元测试:http://www.yiiframework.com/doc/guide/1.1 /en/test.overview.是的,一次只为一个组件编写理想的测试并不容易,但在实际操作中很少会这样. (3认同)
  • @SamDark事实上,Qiang Xue**对于SOLID原则没有任何线索,在查看Yii的代码库时,OOP模式非常明显.在他开始声称它是Web应用程序的最佳框架之前,Qiang Xue应该更好地学习如何编写好的和干净的代码.Yii(甚至第二版)充满了反模式和不良做法.一个常见的例子:当你调用`Yii :: app() - > run()时,你正在访问一个前端控制器.当您调用`Yii:app() - > db`时,您正在访问服务定位器.你有没有听说**神的对象**是什么?就是它`Yii :: app()`返回一个神对象. (3认同)
  • 是的,@ SteffenBrem,那一副幻灯片真是太可怕了. (3认同)
  • 继承噩梦使得调试极其困难和繁琐是不正确的.调试Yii代码比使用更"正确",模式化和分层太多的代码要容易得多. (2认同)
  • 你的一些观点是正确的.这就是现在Yii 2.0的原因:https://github.com/yiisoft/yii2 (2认同)
  • Symfony故意避免称自己为"MVC"框架.除了事实上MVC在标准请求中是不可能的 - >响应上下文(不,这不是肛门,这是*事实*),故意在框架文档中遗漏这一点,表明你知道你在说什么和我想避开那个雷区.至于"没有人使用完全符合OOP原则的框架" - 这只是错误的. (2认同)
  • 许多Yii用户确实认为许多其他框架是不必要的复杂和"学术".没有任何关于"只有非常熟练的开发者才能使用它",但"学术"内容的入门级肯定更高. (2认同)
  • @SamDark Qiang Xue所说的"模型"是Anemic Model(http://www.martinfowler.com/bliki/AnemicDomainModel.html).在OOP中没有"数据模型"这样的东西.如何在Yii中单独使用验证规则和数据库抽象,因为没有"Services"和"Data Mappers"? (2认同)
  • @tereško好像你夸大了一点.替换核心类很容易,只需扩展它们并在配置中覆盖它们.另外,我没有看到关于神对象的大惊小怪.你看到Yii :: app(),你立即抛出一个下意识的反应,就像一个C#程序员看到一个goto.它有它的用途.它本身并不坏,只是因为一些程序员滥用它.它比污染全局命名空间更好.而且,基于网络的语言中根本就没有"真正的"MVC. (2认同)
  • @Rokk他根本不夸张.你所谓的"易于替换"是一种打破封闭原则的典型方式**强强鼓励你去做.根据定义,什么是神对象?这是一个知道并做得太多的对象.首先,`Yii :: app() - > run`有一个`Front Controller`,然后你也可以访问`Yii :: app() - > db`,它有一个`Registry/Service Locator`实现.(顺便说一句,它破坏了SoC和SRP).这就是为什么`Yii:app()`返回一个神对象 (2认同)
  • @Rokk Qiang Xue甚至不懂**非常基本**和非常朴素和简单的东西**像依赖注入.在地狱里他没办法写出一个好的框架. (2认同)

Orl*_*mee 3

我不知道有什么快速的解决方案。这取决于代码是如何编写的。你有数据库和你的视图,所以当你进入 yii 时,它并不是一个真正的完整的新项目。Yii 将为您生成数据库模型。您已经拥有现有项目的视图。编写控制器和操作,并根据需要修改视图。

尝试这些链接,因为它们提到了相同的问题。

如何将旧的 oop 项目转换为 Yii

将现有站点迁移到 Yii 的技巧

Drupal 到 Yii 的迁移