Миграция устаревшего проекта на проблемы с маршрутизацией Symfony

Я пытаюсь начать перенос своего устаревшего проекта на Symfony по частям (приложение Strangler). Я следил за этой документацией, но могу загрузить только мой домашний URL / моего устаревшего приложения. Другие URL-адреса дадут мне 404 еще до того, как я доберусь до класса LegacyBridge.

Что мне не хватает?

EDIT:
Вероятно, люди не понимают моего вопроса. У меня нет проблем с запуском моего проекта Symfony. Я пытаюсь создать приложение Strangler, медленно перенося свой устаревший код на Symfony. Так что мой устаревший код и приложение Symfony работают бок о бок. Но все загружается через интерфейсный контроллер Symfony.

Поэтому я изменил index.php из Symfony public/index.php.

Я добавил класс LegacyBridge во внешний контроллер Symfony:

<?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);

Я уже получаю 404 по строке $response = $kernel->handle($request);.

<?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;
    }
}

person Timo002    schedule 08.10.2019    source источник
comment
Возможно, вам не хватает маршрутов, определенных в /config/routes.yaml   -  person Cid    schedule 08.10.2019
comment
У меня еще нет маршрутов в моем новом приложении Symony. Я полагаю, мне не нужно добавлять устаревшие маршруты в файл route.yaml.   -  person Timo002    schedule 08.10.2019
comment
php bin/console make:controller сгенерирует для вас шаблон и контроллер с маршрутом.   -  person shmshd    schedule 08.10.2019
comment
@MohammedShamshid, я понимаю, но я хочу, чтобы мой проект Legacy запускался через Symfony, постепенно конвертируя его в Symfony. Итак, в основе мне сначала нужно запустить мой Legacy, а не Symfony   -  person Timo002    schedule 08.10.2019
comment
Я не думаю, что в Symfony можно запустить устаревший проект. сгенерируйте контроллеры и переместите свои коды по частям, запустив 2 виртуальных хоста.   -  person shmshd    schedule 08.10.2019
comment
@MohammedShamshid, да, это так! См.: symfony.com/doc/current/   -  person Timo002    schedule 08.10.2019
comment
Вы установили загрузчик устаревших маршрутов?   -  person shmshd    schedule 08.10.2019
comment
опубликуйте содержимое public/index.php и свой класс LegacyBridge.   -  person Arleigh Hix    schedule 08.10.2019
comment
@MohammedShamshid, нет, я хочу использовать Front Controller с Legacy Bridge   -  person Timo002    schedule 08.10.2019


Ответы (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);
}

Это должно позволить продолжить выполнение, несмотря на исключение.

person Arleigh Hix    schedule 08.10.2019
comment
Чтобы было ясно, я не настроил никаких маршрутов в проекте Symfony. Сначала мне нужно запустить унаследованный проект через интерфейсный контроллер Symfony. Если я перейду к /, строки отладки подскажут мне правильный путь, который должен быть выполнен. Если я перейду к /other-url, строки отладки не сработают. Потому что в public/index.php строка над LegacyBride $response = $kernel->handle($request); уже вызывает исключение. 404 Исключение NotFoundHttpException - person Timo002; 08.10.2019
comment
Да: (1/2) ResoureseNotFountExeption в CompiledUrlMatcherTrait.php, строка 70. (2/2) NotFoundHttpException в RouteListener.php, строка 138 - person Timo002; 08.10.2019
comment
@ Timo002 обновил мой ответ, если это не работает, что-то не так с ядром или (?) - person Arleigh Hix; 08.10.2019
comment
Хм, понял, что ты пытаешься, теперь мой $response пуст. Таким образом, LegacyBridge, который ожидает объект Response, жалуется. Неопределенная переменная - person Timo002; 08.10.2019
comment
О, в уловке я создал пустой ответ и установил статус 404. $response = new Response(); $response-›setStatusCode(404); Кажется, это помогает! - person Timo002; 08.10.2019
comment
Хорошо, извините, мой провайдер немного не работал, я обновлю информацию о том, что вы сделали. - person Arleigh Hix; 08.10.2019