Mojolicious - 如何在控制器方法处理和呈现之前拦截传入请求

Mojolicious - how to intercept the incoming request before controller method handles and renders

在 Mojolicious 应用程序中,我需要确定哪个控制器方法将处理传入请求,以便我可以记录远程客户端的详细信息并添加一些逻辑。我只想在一个地方做,而不是在每个控制器方法中做。我已经尝试了一些 HOOKS 但无法弄清楚。非常感谢对此的任何帮助。

OAuth 的 OpenApi Plugin files and also use Oauth2 Plugin 个路由 generated/created。

CORE
  Perl        (v5.16.3, linux)
  Mojolicious (8.22, Supervillain)

OPTIONAL
  Cpanel::JSON::XS 4.04+  (n/a)
  EV 4.0+                 (4.22)
  IO::Socket::Socks 0.64+ (n/a)
  IO::Socket::SSL 2.009+  (2.060)
  Net::DNS::Native 0.15+  (n/a)
  Role::Tiny 2.000001+    (2.000005)

我在 mojolicious mailing list 中提问,得到了 Mojolicious 的创建者 Sebastian Riedel 的答复。谢谢。

为了大家的利益。 $c->match->stackaround_action 钩子中有我正在寻找的信息。

方法如下:

在您的应用程序中 startup 方法:

sub startup {
    my $self = shift;
    ...
        $self->hook(
            around_action => sub {
                my ($next, $c, $action, $last) = @_;
                use DDP;
                p $c->match; 
                # prints all the info about the controller and the method/action
                # it is going to call
                ...
            }
        );
    ...
}

DDP - 输出

Mojolicious::Routes::Match  {
    Parents       Mojo::Base
    public methods (7) : endpoint, find, has, path_for, position, root, stack
    private methods (1) : _match
    internals: {
        endpoint   Mojolicious::Routes::Route,
        position   0,
        root       Mojolicious::Routes,
        stack      [
            [0] {
                action               "controller_method_name",
                controller           "ControllerClassName",
                handler              "openapi",
                id                   3336,
                openapi.object       Mojolicious::Plugin::OpenAPI,
                openapi.op_path      [
                    [0] "paths",
                    [1] "/api/endpoint/path/{id}/status",
                    [2] "get"
                ],
                openapi.parameters   [
                    [0] {
                        description   "job id",
                        in            "path",
                        name          "id",
                        required      JSON::PP::Boolean,
                        type          "number"
                    }
                ]
            }
        ]
    }
}

这是我在 $c->match->stack 中寻找的信息:

               action               "controller_method_name",
               controller           "ControllerClassName",