桥处理程序无法访问存储数据

Bridge handler can't access stash data

我在使用 Mojolicious 编写的 Web 应用程序中有以下代码,它没有按预期工作:桥处理程序没有从路由中获取正确的存储数据(获取 undef),因此其余代码失败,但是,任何路由处理程序中 $self->stash('city') 的调试输出都符合预期。


...
# Router.
my $r = $self->routes->bridge->to('Main#common');
$r->route('/')->to('Main#index')->name('start');
$r->route('/:region/:city/category/:id')->to('Main#list_category')->name('list_category');
$r->route('/:region/:city/part/:id/:name')->to('Main#show_part')->name('show_part');
...
# Controller.
sub common
{
    my $self=shift;
    my $db=$self->db;
    my $city=$self->stash('city');
    my $region=$self->db->selectrow_hashref('select * from region where LOWER(translit)=? ORDER BY region_id LIMIT 1',undef,$city);
    say "City=$city.";
    if(!$region)
    {
        $region={};
    }
    $self->stash(region=>$region);
    return 1;
}
...

我认为这是正确的行为。
查看 this 代码。 当采取适当的路线进行处理时添加占位符,即逐步处理。

真的,看看你的路线。

my $r = $self->routes->bridge->to('Main#common');
$r->route('/')->to('Main#index')->name('start');
$r->route('/:region/:city/category/:id')->to('Main#list_category')->name('list_category');
$r->route('/:region/:city/part/:id/:name')->to('Main#show_part')->name('show_part');

我无法理解您在转到路线 / 时期望的行为。 在这种情况下将调用 Sub common。占位符 city!

没有值

因此,您的路线的正确解决方案必须如下所示:

my $r = $self->routes;
$r->route('/')->to('Main#index')->name('start');

my $r_city = $r->bridge('/:region/:city/')->to('Main#common');
$r_city->route('/category/:id')->to('Main#list_category')->name('list_category');
$r_city->route('/part/:id/:name')->to('Main#show_part')->name('show_part');

顺便说一句,

从 Mojolicious 版本 6.0 开始 bridge 被弃用,取而代之的是 under。因此,您需要在 under.

上替换 bridge

但是,如果您非常非常想在 common 函数中使用占位符 city 的值,您可以查看 this 两行。
您需要在 common 子中编写此 BAD 代码:

sub common {
  my $self = shift;
  my $stack = $self->match->stack;
  warn $self->dumper($stack);
  ...
}

打印$stack,你就明白了如何获取占位符city的值。