maglnet / magl-legacy-application
提供一个能够使用Laminas的力量运行旧应用程序的模块。
Requires
- php: ^7.3 || ^8.0
- laminas/laminas-eventmanager: ^3.0
- laminas/laminas-http: ^2.0
- laminas/laminas-mvc: ^3.0
- laminas/laminas-router: ^3.0
- laminas/laminas-servicemanager: ^3.0
- laminas/laminas-stdlib: ^3.0
- laminas/laminas-view: ^2.5
Requires (Dev)
- laminas/laminas-modulemanager: ^2.5
- laminas/laminas-test: ^3.0
- phpunit/phpunit: ^9
README
在Laminas中运行您的旧应用程序。
简介
由于从头开始重写旧应用程序为Laminas应用程序几乎是不可能的,因为耗时、费力、资源消耗大,因此我在寻找一种将旧应用程序迁移到Laminas应用程序的方法。
Chris Abernethy写的一篇优秀文章描述了如何在ZF1中运行您的旧应用程序,所以我将这篇HowTo迁移到一个小的Laminas模块,以便能够在Laminas中运行旧应用程序。
在Laminas应用程序中运行您的旧应用程序时,您可以通过保留旧应用程序(几乎不变 - 查看“调整您的旧应用程序”)并使用Laminas的力量构建新模块,逐步将现有应用程序迁移到Laminas。
通过添加一个简单的包装器(查看“在您的旧应用程序中使用Laminas”),您还可以在旧应用程序中使用新模块。
安装
通过composer安装
{ "require" : { "maglnet/magl-legacy-application" : "*" } }
在您的Laminas application.config.php
中启用该模块
'modules' => array( 'Application', 'MaglLegacyApplication', ),
将提供的文件data/magl-laminas-legacy-wrapper.php
复制到您的public/
文件夹。
将提供的文件data/.htaccess
复制到您的publix文件夹。
将您的旧应用程序复制到public/
文件夹。
现在您的旧应用程序应该在Laminas中运行。 :)
配置
对于您的旧应用程序中的任何SEO优化路由,请向zend路由器添加一个路由,该路由到旧控制器,并从您的.htaccess
中删除mod_rewrite规则
return array( 'router' => array( 'routes' => array( // example for transferring mod rewrite rules to laminas routes 'legacy-seo-calendar' => array( 'type' => 'Laminas\Mvc\Router\Http\Regex', 'options' => array( 'regex' => '/calendar/(?<foo>.+)', 'defaults' => array( 'controller' => 'MaglLegacyApplication\Controller\Legacy', 'action' => 'index', 'script' => 'index-already-seo-optimized.php', ), 'spec' => '/', ), ), ), ), );
调整您的旧应用程序
在某些情况下,您的旧应用程序可能需要额外的调整才能运行,以下是一些情况
相对路径
对于require
、require_once
或includes
的相对路径现在可能会失败,因为Laminas会执行chdir()
到Laminas的应用程序根目录。因此,您需要调整路径以匹配新的根目录。
示例
include '../lib/somelib.php';
应更改为
include __DIR__ . '/../lib/somelib.php';
使用全局变量/服务器SCRIPT_FILENAME
或SCRIPT_NAME
由于mod_rewrite
规则,SCRIPT_FILENAME
和SCRIPT_NAME
将不再是您的真实脚本。如果您使用这些变量,您需要调整旧应用程序中的这些位置
示例
$script_filename = $_SERVER['SCRIPT_FILENAME']; $script_name = $_SERVER['SCRIPT_NAME'];
应更改为
use MaglLegacyApplication\Application\MaglLegacy; $legacy = MaglLegacy::getInstance(); $script_filename = $legacy->getLegacyScriptFilename(); $script_name = $legacy->getLegacyScriptName();
在您的旧应用程序中使用Laminas
use MaglLegacyApplication\Application\MaglLegacy; $application = MaglLegacy::getInstance()->getApplication(); $yourService = $application->getServiceManager()->get('YourService');
从旧应用程序内部注入响应
无论您在旧应用程序的哪个位置,您都可以绕过旧应用程序的控制器代码,并将响应发送到Laminas控制器包装器。然后,将像在正常的Laminas控制器中一样处理此响应。
use MaglLegacyApplication\Application\MaglLegacy; $application = MaglLegacy::getInstance()->getApplication(); $application->getEventManager()->getSharedManager()->attach('*', MaglLegacy::EVENT_SHORT_CIRCUIT_RESPONSE, function(Event $e){ $response = new \Laminas\Http\Response(); $response->setStatusCode(404); $response->setContent('not found'); $e->stopPropagation(true); return $response; });
贡献
如果您对这个模块有任何问题或问题,请打开一个问题,甚至更好的是,解决它并打开一个pull request。 👍