将旧项目迁移到Symfony路由问题

问题描述 投票:0回答:1

我正在尝试将我的遗留项目逐步迁移到Symfony(Strangler应用程序)。我遵循了this documentation,但只能加载旧版应用程序的主URL /。在我进入LegacyBridge类之前,其他URL也会给我404。

我想念什么?

编辑:可能有人不理解我的问题。我开始Symfony项目没有问题。我正在尝试构建一个Strangler应用程序,将我的遗留代码缓慢迁移到Symfony。因此,我的旧代码和Symfony应用程序正在并行运行。但是所有内容都是通过Symfony的前端控制器加载的。

所以我从Symfony public/index.php修改了index.php。

我向Symfony的前端控制器添加了一个LegacyBridge类:

<?php
// public/index.php
use App\Kernel;
use App\LegacyBridge;
use Symfony\Component\Debug\Debug;
use Symfony\Component\HttpFoundation\Request;

require dirname(__DIR__).'/config/bootstrap.php';

/*
 * The kernel will always be available globally, allowing you to
 * access it from your existing application and through it the
 * service container. This allows for introducing new features in
 * the existing application.
 */
global $kernel;

if ($_SERVER['APP_DEBUG']) {
    umask(0000);

    Debug::enable();
}

if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) {
    Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}

if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) {
    Request::setTrustedHosts([$trustedHosts]);
}

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);

/*
 * LegacyBridge will take care of figuring out whether to boot up the
 * existing application or to send the Symfony response back to the client.
 */
$scriptFile = LegacyBridge::prepareLegacyScript($request, $response, __DIR__);
if ($scriptFile !== null) {
    require $scriptFile;
} else {
    $response->send();
}
$kernel->terminate($request, $response);

我已经在行$response = $kernel->handle($request);上收到404了。

<?php
//src/LegacyBridge.php

namespace App;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class LegacyBridge
{
    public static function prepareLegacyScript(Request $request, Response $response, string $publicDirectory)
    {

        // If Symfony successfully handled the route, you do not have to do anything.
        if (false === $response->isNotFound()) {
            return;
        }

        // Figure out how to map to the needed script file
        // from the existing application and possibly (re-)set
        // some env vars.

        $dir = $request->server->get('SERVER_NAME');
        $dir = str_replace('.test', '.nl', $dir);

        $legacyScriptFilename = realpath($publicDirectory . '/../../' . $dir . '/index.php');

        return $legacyScriptFilename;
    }
}
php symfony model-view-controller controller symfony-routing
1个回答
1
投票

404 响应 应该在您提到的行上生成(如预期的那样,但直到下面的else块才发送:

$scriptFile = LegacyBridge::prepareLegacyScript($request, $response, __DIR__);
if ($scriptFile !== null) {
    require $scriptFile;
} else {
    $response->send();
}

这意味着$scriptFile为空。因此,在您的LegacyBridge中添加以下内容以调试路径:

$legacyScriptFilename = realpath($publicDirectory . '/../../' . $dir . '/index.php');

// next two lines for debug
var_dump($legacyScriptFilename);
die();

return $legacyScriptFilename;

这将转储$legacyScriptFilename并终止进一步的执行,因此您可以验证路径是否正确。

如果您遇到未捕获的Exception,请尝试像这样捕获并抑制它:

try {
  $response = $kernel->handle($request);
} catch (\Exception $e) {
  $response = new Response(); 
  $response->setStatusCode(404);
}

尽管存在异常,这应允许继续执行。

© www.soinside.com 2019 - 2024. All rights reserved.