将纯PHP项目迁移到Yii框架

时间:2012-06-06 16:06:40

标签: php frameworks yii

我几乎完成了一个PHP项目,使用MVC,jQuery和Ajax。这是纯PHP项目。我不知道代码中的任何框架。我想改变这一点。 我发现做了一些研究,结果证明Yii是最好的框架之一。

是否有可能以某种方式将纯PHP项目迁移到Yii?

如果是这样,那该怎么办?我应该遵循哪些步骤来减少工作量并享受Yii框架带来的好处?

我是Yii的新手,任何见解都很受欢迎。

5 个答案:

答案 0 :(得分:47)

TL; DR:不要这样做。这是一个非常糟糕的主意。


The Rant ..

"框架"不是一种神奇的酱油,你加入一个项目,使它变得更好,更有光泽。

  

做了一些研究,我发现Yii是最好的框架之一。

你做了多么奇怪的研究......我很想看到材料。特别是,因为我将它列为第三差的PHP框架。只有CodeIgniter和CakePHP才能超越它的可怕性。

它的原因是代码质量非常差,这个框架显示出来并与不良实践相结合,使其永久化。

为什么要避免迁移?

从你的描述中可以明显看出,你并不熟悉这个框架,也没有以前的经验。

在项目管理中有一个主题:risk management。在这种情况下,在项目的最后阶段添加以前未使用的框架将构成高概率 高影响风险,由于项目的圣人,这也是完全的十足

这意味着出现问题的可能性非常大。当它发生时,它很可能会沉没项目。或者至少在相当长的时间内推迟发布数据。

在完美的世界中,框架用于简化开发的重复性任务,但代价是某些性能。这些是您在项目开始时执行的任务。你不是一个项目的开始。这意味着您将不会从这个"机动"中获益。

为什么不是Yii?

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

继承噩梦

所有控制器都会延伸CController课程,其范围为CBaseController,其范围为CComponent

所有"型号"将扩展以CActiveRecordCFormModel扩展CModel,扩展CComponent,扩展configuration file

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

全球州

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

使用全球状态是核心机制。您将在整个代码库中看到静态调用,如果没有全局状态,Yii的Yii::app()将无法运行。

每次拨打CUrlManager时,您都在访问和/或更改它。

这使得Yii应用程序无法进行单元测试。调试变成了在整个项目中使用grep的练习。

紧耦合

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

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

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

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

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

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

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

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

对于Yii组件,由于静态调用和深度继承,问题进一步复杂化。上面提到的CUrlManager扩展了CComponent,扩展了active record。同样的文件定义了CUrlRuleCBaseUrlRule类。

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

基本上,它是"保存 - 看什么 - 爆炸" 开发方法。

那不是MVC!

Yii没有实现MVC或任何MVC启发的设计模式。它叫什么" MVC"可以描述为 ActiveRecord-Template-Logic 模式。

Yii的创建者选择收集widgets并形成包装,而不是拥有合适的模型层(是的,它应该是一个层)。这会强制应用程序逻辑强制进入"控制器"。

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

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

它不是MVC。从MVC设计模式中获取名称并对某些组件进行打击是一团糟。

所有小事......

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

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

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

  • 在"模块":

    上被拍打

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

答案 1 :(得分:4)

我实际上最近将我从头开始构建的MVC模式网站转换为Yii。它确实需要一些时间才能完成所有工作,但说实话,它非常值得。我能够扔掉很多代码,因为已经有Yii扩展做了我需要的东西。我还建议您保留数据库,因为您可以使用Gii创建控制器和模型,这将为您节省大量时间。

答案 2 :(得分:3)

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

尝试这些链接,因为它们引用了同样的问题。

How do you convert an old oop project into Yii

tips on migrating an existing site to Yii

Drupal to Yii Migration

答案 3 :(得分:0)

由于您已经拥有mvc中的代码,因此您可以更轻松地进行迁移。但是,在迁移到Yii时,由于它可以使用gii非常容易地生成控制器和模型,因此您可以利用它。

因此,首先使用gii生成控制器和模型,然后您可以将现有代码(通过替换我的意思,将代码替换为控制器和模型中的特定函数)替换为内置控制器和模型,以便实现功能您的网站仍然有效。您可以相应地修改视图。但那不是一件好事。

您只需为ajax,jquery和css注册脚本即可。这些也可以。

是的,Yii是最好的框架,所以尽可能多地获益。

谢谢, Ujjwal

答案 4 :(得分:-1)

在这个项目中,你将php转换为yii框架。如果您按照以下步骤操作,这对您来说非常容易。

由于您已经拥有mvc中的代码,因此您可以更轻松地进行迁移。但是,在迁移到Yii时,由于它可以使用gii非常容易地生成控制器和模型,因此可以利用它。

第二,如果你的数据库是准确的,那么50%工作完成。当你使用gii创建CRUD操作然后自动模型 - 视图 - 控制器create.if你在php中创建mvc然后它对你有利。

第三,您可以简单地包含ajax,jquery和css的脚本。这些也可以在主题(CSS,JS,AZAX,BOOTSTRAP)中创建一个文件夹。

四保护 - >视图 - >布局,您可以在其中更改主题..所有

您也可以帮助www.yiiframework.com/doc-2.0/guide-intro-yii.html

如果您认为我的答案有帮助,那么请给我评分......谢谢。