Hatena::Groupangelos

あんじえろおおおおす!

2009-01-25

Angelos::Middleware::*->wrap 00:05  Angelos::Middleware::*->wrap - あんじえろおおおおす! を含むブックマーク はてなブックマーク -  Angelos::Middleware::*->wrap - あんじえろおおおおす!

Angelos::Middleware::*->wrap で無名関数返すとそれが request_handler として登録される。

# これは Angelos::Middleware::MobileJP の wrap メソッド
sub wrap {
    my ( $self, $next ) = @_;
    sub {
        my $req = shift;
        $self->setup_encoding($req);
        $self->decode_params($req);
        my $res = $next->($req);
        $self->escape_specialchars($res);
        $res;
    };
}

$next はこれが渡ってきてるはず。

sub { my $req = shift; $self->handle_request($req) } 

なので、前の Middleware クラスの request_handler がここで実行されて次に渡るという感じ?

実行順は conf/config.yaml の middlewares セクションの配列順だね逆順です。*1
MobileJP とか Unicode 関連はこの順序に気をつけないとダメかも。

Angelos::Middleware::* 23:30  Angelos::Middleware::* - あんじえろおおおおす! を含むブックマーク はてなブックマーク -  Angelos::Middleware::* - あんじえろおおおおす!

generate した project にある conf/config.yaml に追加すると読み込まれる

middlewares:
  - module: Angelos::Middleware::Profile
  - module: Angelos::Middleware::DebugRequest
  - module: Angelos::Middleware::MobileJP
    config:
      foo: bar

config は hash を渡すとコンストラクタ引数として渡せる。

Angelos::Midleware::Builder->_build_request_handler のこのあたり。

        my $middleware_instance
            = $module->new( $middleware->{config}  || {} );

Angelos の起動シークエンス 18:29  Angelos の起動シークエンス - あんじえろおおおおす! を含むブックマーク はてなブックマーク -  Angelos の起動シークエンス - あんじえろおおおおす!

Mouse (Moose) わかってなくて色々すっ飛ばしてる感じ。with がわかってない。

Angelos->setup
  Angelos::BootLoader->new
  $bootloader->run
  Angelos::BootLoader->SETUP
    $self->setup_home
      Angelos::Home->home( $self->appclass )
      BootLoader->new 時に ref $self が渡されてて、それが appclass になってる。
    $self->setup_application_class
      Angelos::Config->application_class( $self->appclass )
    $self->setup_plugins
      $self->setup_debug_plugins
        $self->is_debug なら $self->load_plugin
    $self->setup_engine
      Angelos::Engine->new
        Angelos::Engine::Base が extends されてるから、new 時に Angelos::Engine::Base->BUILD が走るよね?
        Angelos::Engine::Base->BUILD
          $self->build_engine
            $self->build_request_handler
              これ、Angelos::Engine->build_request_handler の方よね?
              $self->handle_request($req)
                HTTP::Engine::Response->new
                Angelos::Context->new
                $self->DISPATCH( $c, $req )
                  $self->dispatcher->dispatch($req)
              Angelos::Middleware::Builder->build( sub { my $req = shift; $self->handle_request($req) } )
                $class->_get_middlewares
                  Angelos::Config->instance->middlewares
                  $class->_build_request_handler( $application_request_handler, $middlewares )
                    middleware の instance 生成とか。config もここで渡してる。
        HTTP::Engine->new
        $engine->load_plugin( $_->{module} ) for $self->config->plugins('engine')
          engine 用の plugin 読み込み
        $self->engine($engine)
    $self->setup_logger
      Angelos::Logger->instance
        (Angelos::Logger->_new_instance)
          my $config = Log::Dispatch::Configurator::YAML->new( $self->_logger_conf_path )
          Log::Dispatch::Config->configure($config)
    $self->setup_components
      $self->engine->component_manager->setup( $self->appclass )
        Angelos::Component::Manager->instance
          $self->{loader} = Angelos::Component::Loader->new;
          $self->{loader}->load_components($app_class);
            Module::Pluggable::Object で qw( ::Web::Controller ::Model ::Web::View ) なやつ読み込み
    $self->setup_dispatcher
      $self->_setup_dispatch_rules
        my $routeset = $self->build_routeset
          Angelos::Dispatcher::Routes::Builder->new->build_from_config
            my $conf_path = $self->config->routes_config_path
              Angelos::Home->path_to( 'conf', 'routes.pl' )
                conf/routes.pl に書いた HTTP::Router なやつを読み込み
            $self->build($conf_path)
        $self->engine->set_routeset($routeset)
Angelos->run
  $self->engine->run

*1:指摘ありがとう。dann さん

danndann2009/01/26 00:16実行順は、yamlで並べた順の逆順かなぁ。上から順にwrapしてくから。

vkgtarovkgtaro2009/01/26 00:36フォローありがとー。

irc で教えてもらったこれがわかりやすかったです。
middleware3(middleware2(middleware1)))

トラックバック - http://angelos.g.hatena.ne.jp/vkgtaro/20090125