控制器在Mojolicious中找不到

时间:2016-03-01 07:19:41

标签: perl mojolicious

我在路由方面有一些奇怪的结果。

PDNController.pm

中的参考代码
    my $r = $self->routes;

    my $auth = $r->under('/' => sub {
    my $self = shift ;
    $self->redirect_to('/login') and return undef unless ($self->is_user_authenticated);
    return 1;
    });

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

    $r->post('/login')->to('login#auth');

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

    $auth->get('/')->to('index#index');

    $auth->get('/vlan')->to('vlan#index');

    $auth->get('/api/vlan/add')->to('vlan#add');

PDNController / Controller / VLAN.pm

中的参考代码
package PDNController::Controller::VLAN;
use Mojo::Base 'Mojolicious::Controller';

sub index {
  my $self = shift;
  $self->render();
}

sub add {
    my $self = shift;
    my %h;
    $h{error} = '';
    $self->res->headers->add( 'Access-Control-Allow-Origin' => '*' );
    $self->render(json => {%h}});  
}


1;

除了/ api / vlan / add之外,此示例中的所有路由都正常但是最后我有错误

[Tue Mar  1 16:54:02 2016] [debug] GET "/api/vlan/add"
[Tue Mar  1 16:54:02 2016] [debug] Routing to a callback
[Tue Mar  1 16:54:02 2016] [debug] Controller "PDNController::Vlan" does not exist
[Tue Mar  1 16:54:02 2016] [debug] Template "vlan/add.html.ep" not found
[Tue Mar  1 16:54:02 2016] [debug] Template "not_found.development.html.ep" not found
[Tue Mar  1 16:54:02 2016] [debug] Template "not_found.html.ep" not found
[Tue Mar  1 16:54:02 2016] [debug] Rendering template "mojo/debug.html.ep"
[Tue Mar  1 16:54:02 2016] [debug] Rendering template "mojo/menubar.html.ep"
[Tue Mar  1 16:54:02 2016] [debug] 404 Not Found (0.052532s, 19.036/s)

为什么控制器名称为PDNController :: Vlan而不是PDNController :: Controller :: Vlan?

Mojolicious 6.51

1 个答案:

答案 0 :(得分:3)

您的控制器名称为PDNController::Controller::VLAN,但您的路线显示为:

$auth->get('/vlan')->to('vlan#index');

这意味着您正在搜索控制器PDNController::Controller::Vlan(控制器名称由Mojolicious更改为initcap),这显然不存在。

有两种解决方案:

  1. 将控制器名称PDNController::Controller::VLAN更改为PDNController::Controller::Vlan,将Controller目录中的文件更改为Vlan.pm
  2. 或将路线更改为以下。

    $auth->get('/vlan')->to('VLAN#index');

  3.   

    为什么控制器名称PDNController :: Vlan而不是   PDNController ::控制器::的Vlan

    错误消息中的

    PDNController::Vlan指向控制器PDNController::Controller::Vlan。错误消息旨在让您更清晰。

    当它说Controller "PDNController::Vlan"表示它是PDNController应用程序的控制器Vlan时(你的应用程序的所有控制器都驻留在Controller目录中),即它是关于PDNController::Controller::Vlan的说法。