桥处理程序无法访问存储数据
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
的值。
我在使用 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
的值。