perl - Mojolicious - 如何在 Controller 方法处理和呈现之前拦截传入的请求

标签 perl mojolicious

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

路由是从几个 OpenApi Plugin 生成/创建的文件并同时使用 Oauth2 Plugin用于 OAuth。

  • 欢乐的细节:
  • 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钩子(Hook)有我正在寻找的信息。

    方法如下:

    在您的申请中 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",
    

    关于perl - Mojolicious - 如何在 Controller 方法处理和呈现之前拦截传入的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57972890/

    相关文章:

    perl - 如何使用 Mojolicious 上传文件?

    perl - Mojolicious 未设置 Cookie 域

    linux - 使用 Unix 工具提取字符串值

    perl - Perl中按长度排序

    java - 如何从 Java 程序执行 Perl 脚本?

    perl - 同一个 nginx 虚拟主机中的几个 (fastcgi/uwsgi/scgi/proxy_pass) Mojolicious 应用程序的示例?

    perl - "IO::Socket::SSL 1.94+ required for TLS support"在 Heroku 上运行 Mojolicious 应用程序时出错

    windows - 如何在 perl 中从当前工作目录后移一级

    Perl 无法安装 Net::SSL

    perl - 在进程之间共享一个复杂的对象