6

私はMojolicious::Guides::Growingのセクションを読んでいます。Mojolicious::Liteを「よく整理された」cpanアップロード可能なアプリケーションに成長させる方法を説明しています。まず、M::Lアプリを起動スクリプトとアプリケーションクラスに分割するように指示します。

package MyApp;
use Mojo::Base 'Mojolicious';

use MyUsers;

sub startup {
  my $self = shift;

  # ...auth stuff omitted...

  my $r = $self->routes;
  $r->any('/' => sub {
    my $self = shift;

    my $user = $self->param('user') || '';
    my $pass = $self->param('pass') || '';
    return $self->render unless $self->users->check($user, $pass);

    $self->session(user => $user);
    $self->flash(message => 'Thanks for logging in.');
    $self->redirect_to('protected');
  } => 'index');

  $r->get('/protected' => sub {
    my $self = shift;
    return $self->redirect_to('index') unless $self->session('user');
  });

  $r->get('/logout' => sub {
    my $self = shift;
    $self->session(expires => 1);
    $self->redirect_to('index');
  });
}

1;

これは私には理にかなっています。しかし、さらに、このアプリケーションクラスは、アクションを使用してコントローラークラスにリファクタリングでき、アプリケーションクラス自体をルーティング情報に還元できると言います。

package MyApp::Login;
use Mojo::Base 'Mojolicious::Controller';

sub index {
  my $self = shift;

  my $user = $self->param('user') || '';
  my $pass = $self->param('pass') || '';
  return $self->render unless $self->users->check($user, $pass);

  $self->session(user => $user);
  $self->flash(message => 'Thanks for logging in.');
  $self->redirect_to('protected');
}

sub protected {
  my $self = shift;
  return $self->redirect_to('index') unless $self->session('user');
}

sub logout {
  my $self = shift;
  $self->session(expires => 1);
  $self->redirect_to('index');
}

1;

package MyApp;
use Mojo::Base 'Mojolicious';

use MyUsers;

sub startup {
  my $self = shift;

  # ...auth stuff omitted...

  my $r = $self->routes;
  $r->any('/')->to('login#index')->name('index');
  $r->get('/protected')->to('login#protected')->name('protected');
  $r->get('/logout')->to('login#logout')->name('logout');
}

1;

これがルートとアクションが混在する「ハイブリッド」バージョンよりも優れている理由がわかりません。コントローラーのredirect_to()を使用してアクション間でリダイレクトするには、別の場所でルーティング情報を確認する必要があるためです。ファイルであり、URLを変更する場合は、1つではなく2つの異なるファイルで変更する必要があります。これ:

  $r->get('/protected' => sub {
    my $self = shift;
    return $self->redirect_to('index') unless $self->session('user');
  });

になる:

sub protected {
  my $self = shift;
  return $self->redirect_to('index') unless $self->session('user');
}

$r->get('/protected')->to('login#protected')->name('protected');

これは、2つの異なるファイルに「保護された」という単語が4回含まれています(ただし、名前(「保護された」)が何をしているのかはまだわかりません)。

ちなみに、私はWeb開発に関しては完全な初心者です。

4

1 に答える 1

10

それは優れていません。むしろ、それは違います。

1人の開発者を超えてすぐに、1つのファイルにアプリを含めることはもはやメリットではありません。あなたはお互いのつま先を踏むことになります。あなたが唯一の開発者であるとしても、1000行以上のファイル内の場所を追跡することは決して簡単ではありません。さらに、1つのファイルを見て、すべてのルートを一目で判断できることは、100以上のルートは言うまでもなく、ルートが数個以上ある場合に非常に役立ちます。

また、ルートが変更されたときに、コントローラーアクションでリダイレクトURLを変更する必要はありません。名前付きルートを使用している場合は、Mojoliciousが自動的に機能します。

于 2012-09-12T22:55:55.243 に答える