Есть ли способ включить Mojolicious::Controller в MojoX::JSON::RPC::Service?

Я работаю с zabbix и пишу интерфейс для взаимодействия с API zabbix. Поскольку zabbix предоставляет интерфейс jsonrpc, я решил использовать MojoX::JSON::RPC::Service. Проблема, с которой я столкнулся, заключается в том, что теперь я столкнулся с взаимодействием с другими службами, написанными с использованием Mojolicious::Controllers, где они ожидают объекты Mojolicious::Controller. Объект Mojolicious::Controller недоступен при использовании MojoX::JSON::RPC::Service.

my $obj = $rpc_obj->register(
               'retrieve',
               sub {
                    # do stuff
               },
               { with_mojo_tx => 1 }
);

Это регистрирует маршрут под названием «извлечение». При доступе к маршруту и ​​запуске анонимной подпрограммы она имеет доступ только к объекту Mojo::Transaction::HTTP.

Итак, у меня нет доступа к приложению для использования плагинов и тайника и других вещей, которые предлагает Mojolicious. Есть ли способ интегрировать Mojolicious::Controller с MojoX::JSON::RPC::Service?

Я мог бы переписать его, чтобы использовать Mojolicious::Controller, но я стараюсь избегать этого, если это возможно.


person jmcneirney    schedule 10.05.2012    source источник


Ответы (1)


Вам следует рассмотреть возможность использования MojoX::JSON::RPC::Dispatcher, так как он наследует все атрибуты от Mojolicious::Controller

ОБЗОР:

# lib/your-application.pm

use base 'Mojolicious';
use MojoX::JSON::RPC::Service;

sub startup {
    my $self = shift;
    my $svc = MojoX::JSON::RPC::Service->new;

    $svc->register(
        'sum',
        sub {
            my @params = @_;
            my $sum = 0;
            $sum += $_ for @params;
            return $sum;
        }
    );

    $self->plugin(
        'json_rpc_dispatcher',
        services => {
           '/jsonrpc' => $svc
        }
    );
}

[ОБНОВЛЕНИЕ] Пример хука:

package Application;
use Mojo::Base 'Mojolicious';
use Application::Firewall;

# This method will run once at server start
sub startup {
    my $app = shift;

    # Routes
    my $r = $app->routes;

    # Validation Middleware
    $app->hook(
        before_dispatch => sub {
            my $self = shift;
            my $data = $self->req->params->to_hash;
            my $vald = Application::Firewall->new($data);

            # mojolicious bug at the time of coding
            delete $data->{""} if defined $data->{""};

            $app->{input} = {};

            if ( keys %{$data} ) {

                # validation the submitted data
                unless ( $vald->validate( keys %{$data} ) ) {
                    $self->render(
                        text   => join( "", @{ $vald->errors } ),
                        status => 500
                    );
                    return 0;
                }

                # Helper (optional)
                # create a helper to get access to the transformed data
                # if your validation rules had/has filters
                # Note! due to a bug in the params function we must do this
                # (... i know, so what)
                $app->{input} = {
                    map { $_ => $vald->{fields}->{$_}->{value} }
                      keys %{ $vald->{fields} }
                };

            }

            return 1;
        }
    );

    # Normal route to controller * with auto-matic input validation *
    $r->route('/')->to(
        cb => sub {
            my $self = shift;
            $self->render(
                text => 'Hello ' . ( $app->{input}->{foobar} || 'World' ),
                status => 200
            );
        }
    );
}

1;
person Ωmega    schedule 10.05.2012
comment
Да, это то, что я делаю. Проблема, с которой я столкнулся, заключалась в том, что при выполнении маршрута «сумма» нет доступа к контроллеру. По сути, я хотел выполнить некоторую авторизацию перед выполнением маршрута. Итак, теперь я пытаюсь добавить хук в $self-›app как $self-›app-›hook( before_dispatch =› sub { ... } ); в приложении, поэтому мне не нужно будет обращаться к Mojolicious::Controller в 'sum()'. search.cpan.org/~sri/Mojolicious-2.94/ lib/Mojolicious.pm#hook - person jmcneirney; 11.05.2012
comment
@jmcneirney - Когда вы используете my $self = shift;, тогда должно быть просто $self->hook... или, если вы используете my $app = shift;, то это $app->hook, но я не уверен, почему вы используете $self->app->hook..? - person Ωmega; 11.05.2012