3

私は Apache と Perl (modperl) を使用しており、ハンドラーでリクエストを処理しています。私はこれが初めてで、賢明な方法で物事をレイアウトする方法がよくわかりません。

現在、私は次のものを持っています:

package MyClass::Handler;

use warnings;
use strict;
# includes

our %action = ( 
   'a' => \&a,
   # And more
);

sub handler {
    my $a = shift;
    my $r = Apache2::Request->new($a);

    # Do things

    return Apache2::Const::OK();
}

「スペース」ごとに異なるファイルを用意する必要がありますか? テンプレートとして stackoverflow を使用する場合、すべてのユーザー管理に User.pm が必要ですか? ストーリーのための Story.pm?

4

2 に答える 2

6

CPANの優れたCGI::Applicationフレームワークに興味があるかもしれません。その名前にもかかわらず、通常の CGI と mod_perl の両方で動作します。これは、Web アプリのディスパッチ テーブルを設定するタスクを非常に簡単にするように設計されています。CGI::Application::Dispatchを投入すると、素敵な REST 風の URL が得られます。

于 2009-06-24T20:28:16.950 に答える
2

最近のプロジェクトでは、新しいResourceURI構成設定を実装するカスタム構成ハンドラーを作成しました。これにより、次のように構成行をhttpd.confに配置できます。

ResourceURI SomeResource GET,POST,DELETE "^/...$"

3つの引数は、私のリソースクラス名、リソースが応答できるHTTPメソッドのリスト、およびリソースのURIに一致する正規表現です。

カスタム構成クラスは、これらの各行を次のようなブロックに置き換えます。

PerlModule Handler::{resource class}
PerlModule Resource::{resource class}

<Location ~ "{uri regex}">
    Order allow,deny
    Allow from all

    <LimitExcept {allowed methods}>
        Order deny,allow
        Deny from all
    </LimitExcept>

    SetHandler modperl
    PerlHandler Handler

    PerlSetVar Resource {resource class}
</Location>

これにより、クラスの読み込みが処理され、Apacheが無効なメソッドを拒否し、ルーティング先のリソースを示すフラグを設定し、すべてのリクエストをHandler :: handler()関数に渡します。

package Handler;

sub handler {
    my $r = shift;
    my $resource_class = 'Resource::' . $r->dir_config('Resource');
    my $handler_class = 'Handler::' . $r->dir_config('Resource');
    my $resource = $resource_class->new($r, $r->uri);
    return Apache2::Const::HTTP_NOT_FOUND unless $resource;
    my $method = $r->method();
    return Apache2::Const::HTTP_NOT_IMPLEMENTED
        unless $handler_class->can($method);
    return $handler_class->$method($r, $resource);
}

ここで、リソースロジック(表現のフォーマット方法を含む)を使用してResource :: *クラスを実装し、GET、HEAD、POSTなどの名前のメソッドを使用してHandler :: *クラスを実装し、$rと$resourceを使用して処理する必要があります。リクエスト。

必要な新しいリソースごとに、1行の構成を追加し、1つのHandlerクラス(多くの場合、汎用基本クラスから継承するほとんど空のモジュールである可能性があります)を実装し、コード。また、別のリソースのリクエストを処理するコンテキストで、1つのリソースオブジェクトを作成する必要があることもよくあります。そのため、私のリソースコンストラクターは、$ rからURIを取得するだけでなく、URIに対して別の引数を取ります。Resource :: Fooにいて、Resource :: Barオブジェクトが必要な場合は、$ bar = Resource :: Bar-> new($ r、'/ bars / 1234');と言うことができます。これは、クライアントが使用するのと同じURIを使用してBarオブジェクトを作成します。

于 2009-06-30T05:24:31.957 に答える