通过一次性工作将项目从yii1迁移到yii2



“几次”,我不得不处理从yii1到yii2的项目迁移,我想与社区分享我的经验。 在这个过程中没有什么复杂的事情,也不会有任何启示。 该出版物的性质是您的经验+初学者教程。

背景知识


如果历史上在yii的第一个版本上进行的项目继续发展,那么每个与它们合作的开发人员迟早都会想到:“ 如果在yii2上进行,那将会有多好 ”。

但是事情通常不会超出思想范围,因为 工作量似乎是巨大的。 总的来说,它的体积是巨大的,但仍然不是禁止的-根据谚语“眼睛害怕”。 另外,为了过渡到行动,需要一定的意志力(我内部一直在为第一个项目的迁移做准备将近一年)。

我的迁移想法很糟糕。

在“显示代码”之前,我会写很多字母“为什么要这么做”,因为 原因决定了工作的性质。 我有2个类似的案例。

在第一个项目中,一切都很简单。 我既是共同拥有者,也是唯一的开发人员。 因此,“我只是厌倦了用yii1写作”的原因非常有说服力。 写作应该是“高”的,否则结果可能是质量差的废话

在第二种情况下,我是一个项目的承包商,该项目是由许多开发人员长期编写的,没有清晰的体系结构。 因此,输出是一大堆旧代码。 这样的重写更容易使您自己辞职;客户不会因为重构而意识到重构,因此每个新开发人员都增加了更多的堆。

情况已陷入僵局:每个人都知道代码存在问题,但他们无法摆脱困境。 我建议逐步将模块迁移到yii2。 1.5个月后,该站点的一部分开始在yii2上工作,这意味着有一个可以迁移的地方和可以使您有意义地工作的基础结构。 当然,您可以继续写得不好,但是您不能再通过“看看周围的恐怖状况”来证明自己的合理性。

开始之前要三思


对于我自己,我已经确定了一些规则。 如果开始迁移,则必须尊重它们,否则就不应该开始迁移。

  1. 有必要理解并接受 “我们为什么需要痔疮”。 可以有任何动机,但应以较大的幅度超过所有缺点。
  2. 如果项目在2-3年内的预测中没有明确的未来,则不应开始迁移。 否则您会很有趣。
  3. 我们在yii2上编写所有新功能,所有开发内容和新内容。 在yii1中,仅应保留支持。 如果不遵循此规则,那么您将立即收到2个活动分支,这将需要2倍的资源。 而且,由于总是没有足够的资源,所以这一切可能会结束。
  4. 不要将任务设置为“愚蠢地重写所有内容”。 “重写所有内容”是如此抽象和无聊,以至于如果您以这种措辞向您的团队表达声音,那么在他们悲伤的表情中,您可以阅读到许多有关您自己的有趣的东西。
  5. 因为 即使无法立即重写“您想要的所有内容”,您仍需要一个逐步迁移的计划-按页面,按服务,按模块。
  6. 最重要的是! 最好将迁移到yii2视为整个针对开发的项目的深度重构。 然后可能会发现,该项目的三分之一根本不需要重写(如果它“按原样”运行良好,并且只需要很少的支持),并且该项目的一部分可以很好地掩埋。 即 不仅杀死服务/页面,还重做项目,以便根本不需要它们。

迁移的想法


我的迁移想法是,在同一虚拟主机上,同一域中yii1和yii2上同一项目的两个分支同时协作。 逐步地,逐步将服务/页面/模块移植到yii2。

例如,有一个网站在yii1上运行

site.ru/ #  site.ru/news #  site.ru/pages #  site.ru/comments #  

我们在yii2上复制了新闻,收到了:

 site.ru/ #  site.ru/news #  (yii2) site.ru/pages #  site.ru/comments #  

重写评论,已收到

 site.ru/ #  site.ru/news #  (yii2) site.ru/pages #  site.ru/comments #  (yii2) 

逐步地,逐步地,直到我们重写了要重写的所有内容。 显然,我们重写的越多,过程就越容易。 最困难的始终是第一步:首页,第一模块,第一服务。

第一部分 只是要同时工作


我将添加重言式,但是一切都非常简单。 在最简单的情况下,将两个分支(yii1和yii2)都放在同一工作区中,如下所示:

 /var/www/site/htdocs/ - DOCUMENT_ROOT   /var/www/site/yii1/ -   yii1 /var/www/site/yii2/ -   yii2 

大概
 /var/www/site/public_html/ - DOCUMENT_ROOT   /var/www/site/protected/ -   yii1 /var/www/site/yii2/ -   yii2 

大概
 /var/www/site/ - DOCUMENT_ROOT   /var/www/site/protected/ -   yii1 /var/www/site/yii2/ -   yii2 


命名和放置目录都没有关系。 必须确保yii1和yii2上的代码在附近并且可以在一个虚拟主机中工作。 同时工作的所有魔力都将在输入脚本index.php和.htaccess中。

这种方法的优点是什么:


  • 在您的开发环境中,将立即提供2个项目分支。 可以很方便,因为 很长时间,您必须同时与他们合作,来回切换。
  • 这两个项目都将直接访问DOCUMENT_ROOT,这对于使用CSS / JS静态函数进行简单工作非常重要。

缺点既可以是美观的(按类型:什么是将所有因素共同干扰的障碍),也可以与多用户工作相关联。 是的,您可以拆分代码存储位置并拆分开发环境中的项目。 这不会改变本质,只是增加细微差别。

我个人为IDE中的yii2分支创建了一个单独的项目,即使分支文件实际上位于附近。

基本示例。 yii1 / yii2项目分支的来源在一个目录中


DOCUMENT_ROOT使用2个输入脚本。

 index.php -  yii1 index_yii2.php -  yii2. 

在文件结构中
 htdocs/ htdocs/index.php htdocs/index_yii2.php yii1/ yii2/ 


index.php
如果您不将项目的文件结构更改为yii1,则index.php将保持不变。

举个例子
 <?php /* * -     . *   , ..     yii1 index.php *       . */ $app = Yii::createApplication('WebApplication', $config); $app->run(); ?> 


index_yii2.php

 <?php defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); //     yii2  index_yii2.php, //      «». $path = '/../yii2/'; require(__DIR__ . $path.'vendor/autoload.php'); require(__DIR__ . $path.'vendor/yiisoft/yii2/Yii.php'); require(__DIR__ . $path.'common/config/bootstrap.php'); require(__DIR__ . $path.'frontend/config/bootstrap.php'); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . $path.'common/config/main.php'), require(__DIR__ . $path.'common/config/main-local.php'), require(__DIR__ . $path.'frontend/config/main.php'), require(__DIR__ . $path.'frontend/config/main-local.php') ); (new yii\web\Application($config))->run();?> 


.htaccess
在.htaccess中,我们将在yii1和yii2之间进行路由

 Options +FollowSymlinks RewriteEngine On RewriteBase / #    yii2 # #   RewriteRule ^test index_yii2.php [L] RewriteRule ^news index_yii2.php [L] #   action RewriteRule ^page/one index_yii2.php [L] #       RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #     yii1 RewriteRule . index.php 

即 以下URL由index_yii2.php处理并在yii2上运行。

 https://site/test https://site/news https://site/page/one 

该网站的其余部分是index.php(yii1)。

这是基本的并发启动。 当然,每个人都有自己的细微差别:团队,用户,访问权限,服务器,不同的存储库等。 每个人都会有自己的花园。

yii1 / yii2分支的源代码分布在目录中


例如,如果您有自己的服务器,则可以将项目分支的存储发布到其他目录。

 /var/www/site/htdocs - DOCUMENT_ROOT    site.ru /var/www/site/protected -   yii1 /srv/site_yii2 -   yii2 

然后,您需要在index_yii2.php中使用项目yii2更改目录的路径。 当然,如果将其禁用或配置了open_basedir,这将起作用。 加上服务器上相应的权限以及已禁用/已配置的SELinux。

index_yii2.php
 <?php defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); $pathYii2 = '/srv/site_yii2/'; require $pathYii2 . 'vendor/autoload.php'; require $pathYii2 . 'vendor/yiisoft/yii2/Yii.php'; require $pathYii2 . 'common/config/bootstrap.php'; require $pathYii2 . 'frontend/config/bootstrap.php'; $config = yii\helpers\ArrayHelper::merge( require $pathYii2 . 'common/config/main.php', require $pathYii2 . 'common/config/main-local.php', require $pathYii2 . 'frontend /config/main.php', require $pathYii2 . 'frontend /config/main-local.php' ); (new yii\web\Application($config))->run();?> 



接下来是什么


如果站点上有用户,则单个授权是至关重要的元素,如果没有单个授权,则实际上不可能同时运行两个分支。 在下一篇文章中,我计划显示组织单个授权有多么容易。 例如,授权本身保留在yii1中,但是授权用户在yii2分支中透明可见,反之亦然。

Source: https://habr.com/ru/post/zh-CN417677/


All Articles