我正在尝试将Symfony 5.4添加到我的遗留项目。关于如何做到这一点,有一个非常好的文档,但有一个大问题-文档假设"正常";Symfony,但是每次我尝试使用他们推荐的composer create-project
方式安装Symfony时,我得到一个带有symfony/runtime
的Symfony版本-这里的大问题是,这个版本有一个完全不同的index.php
:
<?php
use AppKernel;
require_once dirname(_DIR_).'/vendor/autoload_runtime.php';
return function (array $context) {
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};
这里找到的文档是基于一个完全不同的索引文件。
我确实发现我可以删除运行时包,只是复制旧索引,它在大多数情况下都有效,但是你也有console.php
的问题,我担心如果我走这条路,会有越来越多的问题由我的安装期望symfony/runtime
和我手动删除它的
我试着安装Symfony 5.3以及不同的5.4补丁,所有这些都是安装的,即使我在一些5.3/5.4项目上工作,并且有旧的index.php
文件。
有谁知道如何安装Symfony的"old"index.php
,console.php
等?
谢谢!
所以任务是从非Symfony遗留应用程序迁移到Symfony应用程序。基本思想是允许Symfony应用程序处理请求,然后在必要时将其传递给遗留应用程序。Symfony文档展示了如何做到这一点,但它依赖于旧风格的index.php文件。新的基于运行时的方法有点不同。
但最终,它真正需要的是两个相当简单的类。runner类负责创建请求对象并将其转换为响应。这是你可以将桥添加到你的旧应用程序的地方。它是Symfony的HttpKernelRunner类的克隆:
namespace AppLegacy;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpKernelHttpKernelInterface;
use SymfonyComponentHttpKernelTerminableInterface;
use SymfonyComponentRuntimeRunnerInterface;
class LegacyRunner implements RunnerInterface
{
private $kernel;
private $request;
public function __construct(HttpKernelInterface $kernel, Request $request)
{
$this->kernel = $kernel;
$this->request = $request;
}
public function run(): int
{
$response = $this->kernel->handle($this->request);
// check the response to see if it should be handed off to legacy app
dd('Response Code ' . $response->getStatusCode());
$response->send();
if ($this->kernel instanceof TerminableInterface) {
$this->kernel->terminate($this->request, $response);
}
return 0;
}
}
接下来,您需要通过扩展SymfonyRuntime::getRunner方法来连接运行器:
namespace AppLegacy;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpKernelHttpKernelInterface;
use SymfonyComponentRuntimeRunnerInterface;
use SymfonyComponentRuntimeSymfonyRuntime;
class LegacyRuntime extends SymfonyRuntime
{
public function getRunner(?object $application): RunnerInterface
{
if ($application instanceof HttpKernelInterface) {
return new LegacyRunner($application, Request::createFromGlobals());
}
return parent::getRunner($application);
}
}
最后,更新composer。Json来使用您的遗留运行时类:
"extra": {
...
"runtime": {
"class": "App\Legacy\LegacyRuntime"
}
}
更新作曲器后。执行composer update
,使更改生效并启动服务器。导航到一个路由,你应该点击dd语句。