加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 为什么在mojolicious中分离路由和控制器操作?

发布时间:2020-12-16 06:27:47 所属栏目:大数据 来源:网络整理
导读:我正在阅读 Mojolicious::Guides::Growing的部分,它告诉你如何将Mojolicious :: Lite发展成一个“组织良好”的cpan-uploadable应用程序.首先,它告诉您将M :: L应用程序拆分为启动脚本和应用程序类. package MyApp;use Mojo::Base 'Mojolicious';use MyUsers;
我正在阅读 Mojolicious::Guides::Growing的部分,它告诉你如何将Mojolicious :: Lite发展成一个“组织良好”的cpan-uploadable应用程序.首先,它告诉您将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()的动作之间重定向,你需要在不同的路由信息??中查看文件,如果你想更改网址,你必须在两个不同的文件而不是一个文件中.这个:

$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');

在两个不同的文件中有4次“受保护”一词(虽然我不确定名称(“受保护”)的用途).

顺便说一句,在Web开发方面,我是一个完全新手.

解决方法

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

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

此外,当路由更改时,您不必更改控制器操作中的重定向URL.如果您正在使用命名路线,Mojolicious将为您完成工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读