Проблема с работой маршрутов Mojolicious

Следующее определение маршрута работает хорошо

sub load_routes {
 my($self) = @_;

 my $root = $self->routes;

 $root->get('/')->to(                 controller=>'Snipgen', action=>'indexPage');
 $root->any('/Snipgen')          ->to(controller=>'Snipgen', action=>'SnipgenPage1');
 $root->any('/Snipgen/show')     ->to(controller=>'Snipgen', action=>'SnipgenPage2');
 }

и "./script/snipgen.pl маршруты -v" дают

/              ....  GET               ^
/Snipgen       ....  *    Snipgen      ^/Snipgen
/Snipgen/show  ....  *    Snipgenshow  ^/Snipgen/show

но это не удается для http://127.0.0.1:3000/Snipgen/, страница не найдена

sub load_routes {
 my($self) = @_;

 my $root = $self->routes;

 $root->get('/')->to(controller=>'Snipgen', action=>'indexPage');
 my $myaction = $root->any('/Snipgen')->to(controller=>'Snipgen', action=>'SnipgenPage1');
 $myaction->any('/show')              ->to(controller=>'Snipgen', action=>'SnipgenPage2');
 }

и соответствующие маршруты "./script/snipgen.pl -v" дают

/         ....  GET           ^
/Snipgen  ....  *    Snipgen  ^/Snipgen
  +/show  ....  *    show     ^/show

Все субтитры SnipgenPageXX имеют return; как их последняя строка. Есть идеи, что происходит не так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документации Mojolicious указано, что маршрут с детьми не может быть составлен сам по себе. Вы можете обойти это, добавив дочерний маршрут с помощью '/'. Другой вариант — использовать под(), что обеспечивает больший контроль за счет добавления цели отправки для частичного маршрута. Как было предложено в комментариях Брайана Д. Фоя, вы можете отображать маршруты вашего приложения, передав параметр routes в скрипт вашего приложения следующим образом: perl -Ilib script/my_app routes -v. См. документацию здесь и здесь. Шаблон Mojolicious «Страница не найдена» также отображает ваши маршруты вверху страницы.

Вы хотите, чтобы маршруты выглядели так:

/         ....  *           ^
/Snipgen  ....  *  Snipgen  ^/Snipgen
  +/      ....  *           ^
  +/show  ....  *  show     ^/show

Вместо:

/         ....  *           ^
/Snipgen  ....  *  Snipgen  ^/Snipgen
  +/show  ....  *  show     ^/show

Добавление ребенка с помощью '/':

sub load_routes {
    my($self) = @_;

    my $root = $self->routes;

    $root->any('/')->to(controller=>'Snipgen', action=>'indexPage');
    my $myaction = $root->any('/Snipgen')->to(controller => 'Snipgen');;
    $myaction->any('/')->to( action=>'SnipgenPage1');
    $myaction->any('/show')->to( action=>'SnipgenPage2');
}

Используя under()

sub load_routes {
    my($self) = @_;

    my $root = $self->routes;

    $root->get('/')->to(controller=>'Snipgen', action=>'indexPage');
    my $myaction = $root->under('/Snipgen');#->to('Auth#check')
    $myaction->any('/')->to(controller=>'Snipgen', action=>'SnipgenPage1');
    $myaction->any('/show')->to(controller=>'Snipgen', action=>'SnipgenPage2');
}

Или добавьте дочерний маршрут следующим образом:

sub load_routes {
    my($self) = @_;
    my $root = $self->routes;
    
    $root->get('/')->to(controller=>'Snipgen', action=>'indexPage');
    my $myaction = $root->get('Snipgen')
        ->to(controller=>'Snipgen', action=>'SnipgenPage1')
           ->add_child(Mojolicious::Routes::Route->new);
    $myaction->get('show')->to(controller=>'Snipgen', action=>'SnipgenPage2');
}

Если вы запустите perl -Ilib script/myapp.pl routes -v, вы увидите, как моджо решает маршрутизировать вещи. Вы должны увидеть, что нет маршрута, соответствующего URL-адресу.

brian d foy 24.04.2024 10:42

Я так и не понял, что отображает «routes -v». Использование его здесь является хорошим примером: выходные данные различаются для двух случаев, но, насколько я могу судить, он по-прежнему говорит, что оба URL-адреса совпадают. Как он показывает, что ни один маршрут не соответствует URL-адресу?

ferg 24.04.2024 15:53

@ferg По отступу и знаку + вы можете сказать, что Snipgen является промежуточным маршрутом и сам по себе не будет соответствовать.

clamp 24.04.2024 17:56

Где описан вывод «routes -v»? Думаю, мне нужно знать, какой контроллер и действие или что-то еще запускается путем.

ferg 25.04.2024 09:39

Другие вопросы по теме