Маршрут не найден в префиксе Root Path - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь настроить компонент symfony / routing в моем проекте ..

Все идет хорошо, но когда я определяю префикс для маршрутов, он выбрасывает исключение для маршрута, не найденное для корневого пути этого префикса.

Например, предположим, у меня есть куча административных маршрутов. Вместо того, чтобы определять ключевое слово «admin» на каждом маршруте, я создал префиксный маршрут для всех этих маршрутов. Таким образом, мой путь к панели инструментов превратился в "/" из "/admin". И теперь он выдает ошибку маршрута не найдено ..

Когда я проверял коллекции маршрутов. Путь к панели инструментов выглядит как "/admin/". И это не соответствует REQUEST_URI

Я плохо настраиваю компонент или есть какие-то предостережения, которые мне нужно сделать?

Вот часть RouteProvider

foreach (scanDirectory(ROOT_PATH . "/routes") as $file) {
    $subCollection = new RouteCollection();
    $filepath = ROOT_PATH . "/routes/" . $file;
    $routes = Yaml::parseFile($filepath);

    $prefix = "api";

    if (array_key_exists("prefix", $routes)){
        $prefix =  $routes["prefix"];
        unset($routes["prefix"]);
    }

    foreach ($routes as $name => $route) {
        $parameters = (new RouteParser($route))->parse();
        $subCollection->add(
            $name,
            new Route(...$parameters)
        );
    }
    $subCollection->addPrefix($prefix);
    $subCollection->addOptions([
        "trailing_slash_on_root" => false
    ]);
    $collection->addCollection($subCollection);
 }

1 Ответ

1 голос
/ 07 ноября 2019

Я немного поковырялся в компоненте роутера. Функциональность trailing_slash_on_root реализована как часть процесса загрузчика. Поэтому я думаю, вам нужно установить его в файле маршрутов. Вы не предоставили пример того, как выглядят ваши файлы маршрутов администратора, поэтому я не уверен. Обычно я ожидаю увидеть только загруженный файл основных маршрутов, который, в свою очередь, будет загружать отдельные наборы маршрутов, такие как ваши маршруты администратора.

Однако, используя ваш опубликованный код в качестве примера, мы можем реализовать тот же процесс, которыйtrailing_slash_on_root использует. В основном мы явно отбрасываем косую черту для маршрута панели мониторинга после того, как вся обработка выполнена. Вот полный автономный рабочий пример, взятый в основном из документации по компонентам маршрутизации:

$rootCollection = new RouteCollection();
$adminCollection = new RouteCollection();

$route = new Route('/users',['_controller' => 'admin_users_controller']);
$adminCollection->add('admin_users',$route);

$route = new Route('/',['_controller' => 'admin_dashboard_controller']);
$adminCollection->add('admin_dashboard',$route);

$adminCollection->addPrefix('/admin'); # This actually adds the prefix

# *** Explicitly tweak the processed dashboard route ***
$route = $adminCollection->get('admin_dashboard');
$route->setPath('/admin');

$rootCollection->addCollection($adminCollection);

$context = new RequestContext('/');

// Routing can match routes with incoming requests
$matcher = new UrlMatcher($rootCollection, $context);
$parameters = $matcher->match('/admin/users');
var_dump($parameters);

$parameters = $matcher->match('/admin');
var_dump($parameters);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...