为什么 Dancer `halt` 命令绕过所有事件?
Why Dancer `halt` command bypass all events?
示例:
hook on_route_exception => sub {
# This code is not executed
}
hook on_handler_exception => sub {
# This code is not executed
}
hook after => sub {
# This code is not executed
}
hook after_error_render => sub {
# This code is not executed
}
hook before => sub {
if ($some_condition) {
halt("Unauthorized");
# This code is not executed :
do_stuff();
}
};
get '/' => sub {
"hello there";
};
我可以找到 this piece 的文档:
Thus, any code after a halt is ignored, until the end of the route.
但是钩子在路由结束之后,所以不应该被忽略。应该是?
为什么 hooks 也被忽略了?
我认为原因是处理停止了。
halt("Unauthorized");
本质上 return 响应对象中的内容,不需要进一步的事件。停止有效地停止了 request/response.
的所有处理
这是根据其行为方式和描述做出的猜测。
仔细看看:https://metacpan.org/release/BIGPRESH/Dancer-1.3513/source/lib/Dancer.pm#L156
显示在将响应内容设置为“未授权”后,它会调用:
Dancer::Continuation::Halted->new->throw
哪个死了:
https://metacpan.org/release/BIGPRESH/Dancer-1.3513/source/lib/Dancer/Continuation.pm#L14
sub throw { die shift }
至少我是这样读代码的。既然死了就没有别的事可做了。
可能是基于停止意图的故意设计决定。
示例:
hook on_route_exception => sub {
# This code is not executed
}
hook on_handler_exception => sub {
# This code is not executed
}
hook after => sub {
# This code is not executed
}
hook after_error_render => sub {
# This code is not executed
}
hook before => sub {
if ($some_condition) {
halt("Unauthorized");
# This code is not executed :
do_stuff();
}
};
get '/' => sub {
"hello there";
};
我可以找到 this piece 的文档:
Thus, any code after a halt is ignored, until the end of the route.
但是钩子在路由结束之后,所以不应该被忽略。应该是?
为什么 hooks 也被忽略了?
我认为原因是处理停止了。
halt("Unauthorized");
本质上 return 响应对象中的内容,不需要进一步的事件。停止有效地停止了 request/response.
的所有处理这是根据其行为方式和描述做出的猜测。
仔细看看:https://metacpan.org/release/BIGPRESH/Dancer-1.3513/source/lib/Dancer.pm#L156
显示在将响应内容设置为“未授权”后,它会调用:
Dancer::Continuation::Halted->new->throw
哪个死了:
https://metacpan.org/release/BIGPRESH/Dancer-1.3513/source/lib/Dancer/Continuation.pm#L14
sub throw { die shift }
至少我是这样读代码的。既然死了就没有别的事可做了。
可能是基于停止意图的故意设计决定。