laravel - 随着时间的推移,使用 Laravel 部分重构旧的大型 PHP 应用程序?

标签 laravel eloquent

从我读过的内容来看,由于 Laravel 的模块化特性,这应该是可能的,但我需要有更多 Laravel 经验的人保证:

我有一个非常大的(500k loc)古老的 PHP 应用程序。太古老了,它的某些部分可以追溯到 PHP3 时代(大约 2000 年,PHP4 已经发布,但出于向后兼容性的原因使用 PHP3)。

重构这是一个巨大的项目,合理地做到这一点的唯一方法是部分。替换这个部分,然后替换那个部分,等等。幸运的是,“古老”部分派(dispatch)上了用场,因为没有使用框架,基本上每个页面都是它自己的脚本,有一些用于共享功能的中央库。

是否可以启动一个 Laravel 应用程序,该应用程序可以将新/重构的页面路由到新站点,并将其他所有内容(如果可能,通配符)路由到古老的代码?所有数据都存储在数据库中,因此除了用户身份验证和 session 信息之外,它们之间不会出现同步问题。

是否有可能在古老的数据库设计上获得 Eloquent 运行,或者以一种对两者都适用的方式重构数据库?之前有一次尝试将 DB 接口(interface)移动到 Doctrine,据我所知,它在部分成功后被中止(即许多 DB 对象是通过 Doctrine 访问的,但也有很多并行的直接 SQL 代码)。

这是一个巨大的困惑,但有问题的软件仍在使用并成功,并且之前尝试用其他东西替换它已经失败。

额外细节:

感谢@maiorano84 提出的好问题:

First, does your legacy application have tests?



对此持否定态度。 PHPUnit 于 2004 年发布。当时,这个应用程序已经投入生产了四年。

Second, are you able to get it to work on a more recent version of PHP?



是的,当前的代码库在 PHP 5.6.33 上运行 - 它多年来一直在维护,并且对 PHP 4 和 PHP 5 之间的转换进行了重大更新。

最佳答案

是否可以?是的。

会不会需要很短的时间?绝对不。

对于任何类型的遗留代码库,您都需要花时间弄清楚它的所有事件部分,并弄清楚需要更改哪些部分才能在现代平台上工作。

最新版本的 Laravel 需要 PHP 7.1.3,因此即使尝试将整个代码库转储到 Laravel 应用程序中也很可能会导致失败。

首先,您的遗留应用程序有测试吗?这些可以是单元测试、集成测试或功能测试。如果不是这样,并且您希望能够在将来不破坏任何东西的情况下对应用程序进行现代化改造,那么您将需要编写测试以确保在开始升级时不会出现任何问题。仅此一项就可能需要很长时间,尤其是在代码库中,甚至一开始就很难进行测试。拥有一个经过全面测试的应用程序可以让您在开始修改应用程序时查看哪些测试开始失败,因此这些信息将非常有值(value)。

其次,您能否让它在更新版本的 PHP 上运行?如果此代码已经投入生产,那么您将需要通过 Vagrant 使用一些硬件虚拟化。 ,或者更好的是,通过 Docker 实现容器化在不破坏生产代码的情况下启动并运行本地安装。

一旦准备好,那么您应该能够开始重构。获取整页代码并将它们直接转储到 Laravel 应用程序中并不能一蹴而就。你会想要从更小的开始。找到你所有的事件部分,弄清楚每个部分负责什么,然后用适当的方法将它们封装在类中。

使用 Composer 的 PSR-4 Autoloader帮助删除所有这些额外的includerequire语句并在整个应用程序中加载新类。

使用体面的Router将所有 URL 更改为对 SEO 友好的路径,并为所有请求明确定义入口点。

将所有业务逻辑移出 webroot:创建 /public您只有 index.php 的文件夹入口点和所有面向公众的 Assets (图像、css、javascript 等)。由于此时所有请求都被路由到此文件,因此您应该能够处理请求并返回您的响应。

一旦你将应用程序真正放入定义良好的组件和模块的系统中,那么迁移到 Laravel——或任何其他完善的框架——应该会容易得多。

这将带你一个如果你打算做对的话,时间。希望这对您有所帮助,并祝您好运。

关于laravel - 随着时间的推移,使用 Laravel 部分重构旧的大型 PHP 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50569943/

相关文章:

laravel - Codeception,无法模拟ajax行为

php - 如何在 Laravel 中使用 Left Join 查找匹配记录

laravel - 如何检查 Eloquent 多态关系是否存在?

php - 使用 Eloquent 查找或创建

php - eloquent/laravel 的 save() 方法出现错误 500

mysql - 如果一列值为空,则按照 Laravel 中另一列值的顺序排序

mysql - Laravel 5.4 将 NULL 保存到数据库不起作用

laravel - $model->get() 上 Eloquent Model 时间戳的时区错误,但使用 print_r() 正确

Laravel 5.6 使用 MAMP 服务器连接被拒绝

php - 使用 laravel 获取具有子类别的类别