2017-02-23 6 views
0

ajax形式からこのルータのfoundnameが呼び出されると、値を処理して別のルータに渡す必要があります。ここに私が試している方法のサンプルがあります:Mojolicious :: Liteを使用してルータ間で値を渡す

#!/usr/bin/perl 

use Mojolicious::Lite; 

get '/foundname' => sub { 

    my $c = shift; 
    # Here I get the value from the form 
    my $name_on = $c->req->query_params->param('name'); 

    if($name_on) { 
    # call another router and pass the name value to it 
    # It gives an error "Can't locate object method "get" ", I might not need to use "get", just don't know how to pass the value. 
    $c->get('/process_name')->to(searched => $name_on); 
    } 

}; 

get '/process_name' => sub { 

    my $c = shift; 
    my $got_name = $c->req->query_params->param('searched'); 
    ... 
}; 

ありがとう!

+0

新しいルートを動的にインストールしますか?あなたのコードは次のようになります。私はそうは考えにくいと思います。おそらく内部転送を行い、本質的に '/ process_name'を呼び出すことを望みます。あれは正しいですか? – simbabque

+0

はい、私はそのような通信が必要ないくつかの内部ルートを持っています。 – Maresia

答えて

1

あなたのappの中にあるMojolicious::Routesオブジェクトを通してルートをルックアップする必要があります。 lookupの名前は、Mojolicious :: LiteによってURIのパス部分から自動生成されるため、/process_nameの名前はprocess_nameです。

Mojolicious::Routes::Routeにはrenderというメソッドがあり、そこにパラメータを渡すことができます。

use Mojolicious::Lite; 

get '/foundname' => sub { 
    my $c = shift; 

    my $name_on = $c->req->query_params->param('name'); 

    if($name_on) { 
     my $process_name = app->routes->lookup('process_name')->render({ searched => $name_on }); 
     $c->render(text => $process_name); 
    } 
}; 

get '/process_name' => sub { 
    my $c = shift; 
    my $got_name = $c->req->query_params->param('searched'); 

    $c->render(text => $got_name); 
}; 

app->start; 

これをカールすると、応答としてパラメータが返されます。

$ curl localhost:3000/foundname?name=foo 
/process_name 

しかし、これはおそらく正しいアプローチではありません。ビジネスロジックを実装する場合は、内部または隠れたルートを使用しないでください。あなたのアプリケーションはまだPerlだけであることを忘れないでください。 subと書くことができます。あなたは簡単にこれらの機能をユニット・テストすることができるよう

use Mojolicious::Lite; 

get '/foundname' => sub { 
    my $c = shift; 

    my $name_on = $c->req->query_params->param('name'); 

    if($name_on) { 
     my $got_name = process_name($name_on); 
     $c->render(text => $got_name); 
    } 
}; 

sub process_name { 
    my ($got_name) = @_; 

    # do stuff with $got_name 

    return uc $got_name; 
}; 

app->start; 

この意志出力

$ curl localhost:3000/foundname?name=foo 
FOO 

それは、よりポータブルなアプローチです。 $cが必要な場合は、それを渡す必要があります。また、定義したsubにはappというキーワードがあります。元の質問については

+0

アプリを「標準のperl」からフレームワークスタイルに変換しているので、私は2番目のアプローチが好きです。しかし、それはPerlのサブルーチンをMojolicious :: Liteを使ってルーターに変換する必要があるのでしょうかという疑問が浮上していますか? – Maresia

+0

@Maresia私は直接アクセスポイントを_routes_に変換するだけです(_router_ではなく、着信要求を処理するものです)。したがって、すべてのエントリポイントにはサブがあります。 Mojoはそれらの_controllers_を呼び出します(そのため、 '$ c'があります)。通常、それらはフラットにしておきます。私は、ビジネスロジックのための別々のパッケージを作成し、そこから関数を呼び出すことになります。またはそれらをオブジェクトにする。 – simbabque

+0

"ルーター"タイプミスについては申し訳ありません。あなたが言ったことは理にかなっています。エントリーはルートを呼び出し、呼び出しをサブからデータを処理するなどの処理を行います。ドキュメントは、幅広く、このトピックについての詳しい説明があるサイトをお勧めします。 – Maresia

0

、私は上の変数を渡すの詳細については、この質問を参照してください

$c->redirect_to() 

を使用します。 Passing arguments to redirect_to in mojolicious and using them in the target controller

======

しかし、私は希望(他の人が言っているように)より多くを書いてください。 既存のロジックがある場合は、ヘルパーでラップしたり、ロジックをヘルパーに入れて呼び出すことができます。

helper('process_name'=> sub{ 
    my $self,$args = @_; 

    # Do some logic with $args->{'name'} 
    return $something; 
}); 

get '/foundname' => sub { 
    my $c = shift; 

    my $name_on = $c->req->query_params->param('name'); 

    if($name_on) { 
     my $process_name = $c->process_name({name => $name_on}); 
     $c->render(text => $process_name); 
    }else{ 
     $c->redner(text => 'Error',status=>500); 
    } 
}; 
関連する問題