首页 > 解决方案 > 如何覆盖 Mojolicious::Controller->new 方法

问题描述

假设我有一个 Mojo 控制器,里面有一个虚拟的方法init

package App::Controller 
use Mojo::Base 'Mojolicious::Controller';

sub init {
  my $self = shift;
  # Do things with $self->param('myparam');
}
...

我想扩展它并对init方法进行更改。

在这个例子中,我创建了一个子类App::Controller::Person,我想从参数中提取一个值并用它做一些不同的事情。

package App::Controller::Person;
use parent 'App::Controller';

sub init {
  my $self = shift;
  # Do different things with $self->param('myparam');
}
...

希望能够在实例化控制器时注入或调用 init 方法,但似乎无法弄清楚如何去做。

最初,我想通过执行以下操作来覆盖new方法App::Controller

package App::Controller 
use Mojo::Base 'Mojolicious::Controller';

sub new {
  my ($class, @args) = @_;
  my $self = $class->SUPER::new(@args);
  $self->init();
  return $self;
}

但我没有任何运气。我猜我没有正确地将事情传递给 SUPER,但似乎无法弄清楚我需要做什么才能让它工作。

我该如何实施这样的事情?

标签: perloopinheritancemodel-view-controllermojolicious

解决方案


推荐阅读