在 Mojolicious 中找不到控制器
Controller not found in 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?
莫霍利西斯 6.51
你的控制器名称是PDNController::Controller::VLAN
,但你的路线是:
$auth->get('/vlan')->to('vlan#index');
这意味着您正在搜索显然不存在的控制器PDNController::Controller::Vlan
(控制器名称已被 Mojolicious 更改为 initcap)。
有两种解决方法:
- 将您的控制器名称
PDNController::Controller::VLAN
更改为 PDNController::Controller::Vlan
并将控制器目录中的文件更改为 Vlan.pm
。
或将路线更改为以下。
$auth->get('/vlan')->to('VLAN#index');
Why controller name PDNController::Vlan and not
PDNController::Controller::Vlan
错误消息中的 PDNController::Vlan
指向控制器 PDNController::Controller::Vlan
。错误消息旨在让您更加清楚。
当它说 Controller "PDNController::Vlan"
时,这意味着它是 PDNController 应用程序的控制器 Vlan(您应用程序的所有控制器都位于 Controller 目录中),即它在说 PDNController::Controller::Vlan
。
我在路由中有一些奇怪的结果。
参考代码在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?
莫霍利西斯 6.51
你的控制器名称是PDNController::Controller::VLAN
,但你的路线是:
$auth->get('/vlan')->to('vlan#index');
这意味着您正在搜索显然不存在的控制器PDNController::Controller::Vlan
(控制器名称已被 Mojolicious 更改为 initcap)。
有两种解决方法:
- 将您的控制器名称
PDNController::Controller::VLAN
更改为PDNController::Controller::Vlan
并将控制器目录中的文件更改为Vlan.pm
。 或将路线更改为以下。
$auth->get('/vlan')->to('VLAN#index');
错误消息中的Why controller name PDNController::Vlan and not PDNController::Controller::Vlan
PDNController::Vlan
指向控制器 PDNController::Controller::Vlan
。错误消息旨在让您更加清楚。
当它说 Controller "PDNController::Vlan"
时,这意味着它是 PDNController 应用程序的控制器 Vlan(您应用程序的所有控制器都位于 Controller 目录中),即它在说 PDNController::Controller::Vlan
。