gpt4 book ai didi

perl - 为什么要在 mojolicious 中分离路由和 Controller Action ?

转载 作者:行者123 更新时间:2023-12-04 14:03:21 24 4
gpt4 key购买 nike

我正在阅读 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;

这对我来说很有意义。但是接着又说,这个应用类可以进一步重构为一个带有 Action 的 Controller 类,而应用类本身可以简化为路由信息:
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;

我不明白为什么这比路由和 Action 混合的“混合”版本优越,因为现在为了在 Controller 中使用 redirect_to() 在 Action 之间重定向,你需要查看不同的路由信息文件,如果你想改变一个 url,你必须在两个不同的文件中而不是一个文件中进行。这个:
  $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');

在两个不同的文件中,“protected”这个词出现了 4 次(虽然我还不确定这个名字(“protected”)是做什么的)。

顺便说一下,在 Web 开发方面,我是一个完整的新手。

最佳答案

这并不优越;相反,它是不同的。

一旦你超越了一个开发人员,将你的应用程序放在一个文件中就不再是一种好处;你们最终会踩到彼此的脚趾。即使您是唯一的开发人员,跟踪 1000 多行文件中的位置也绝非易事。此外,当您的路由不止几条,更不用说 100+ 时,能够查看一个文件并一目了然地确定所有路由非常有用。

此外,当路由更改时,您不必更改 Controller 操作中的重定向 url。如果您使用命名路由,Mojolicious 将为您完成这项工作。

关于perl - 为什么要在 mojolicious 中分离路由和 Controller Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12396934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com