调度表(或调度方法)既是表(模型)又是路由器/控制器。
想象一个选项卡式导航,其中可能有 30 个选项卡供不同的最终用户使用。每个选项卡本质上是一个拥有自己的控制器和视图的页面。就我而言,调度表包含选项卡的键,然后包含每个选项卡的数据(路径、显示名称、可见性等)。
my $tabs = {
Home => {
action => \&HomeController::dashboard,
displayName => ‘Home’,
...
},
About => {
action => \&AboutController::info,
displayName => ‘About Us’,
...
},
...
};
最初我有一个 TabController 和 TabView。控制器内部是一个调度表;但是它似乎并不符合 MVC。当只有 3 个选项卡时看起来不错,但当它增长时就不同了,尤其是当它需要安全修剪或过滤视图时。
将其移至模型是有意义的,因为它更多地被视为数据表。然而,因为它是 Perl(和一个调度表),所有相应的包也必须被加载。所以这个 TabModel 正在加载许多控制器(在某些情况下是视图)。我不是特别喜欢在模型中加载/引用任何控制器,所以加载 multi 感觉更糟。
这种情况是否有最佳实践或示例?
附录
试图提供一些更切实的东西。我将尝试围绕一个临时的 Web 应用程序来构建它。这只是一个概念性的例子,没有完全工作并且遗漏了很多;但希望应该添加更多的描述和上下文。它具有以下目录结构:
index.pl -- entrance
Controllers/
-- Dashboard.pm
-- Home.pm
-- About.pm
Models/
-- Tabs.pm
-- Users.pm
Views/
-- Dashboard.pm
-- Home.pm
-- About.pm
-- Error.pm
我不会分解 index.pl,但它本质上是解析参数并指向 DashboardController::dashboard。
仪表板控制器
package Controllers::Dashboard;
sub dashboard{
my $users = Models::Users::get_all(); # Users Model
my $tabs = Models::Tabs::get_permitted( # Tabs Model
$users->{CURRENT_USER}{permissions}
);
print Views::Page::render($users,$tabs); # Page View
}
关于控制器
package Controllers::About;
sub info {
# No models necessary
print Views::About::render();
}
选项卡模型
package Models::Tabs;
use Controllers::Home;
use Controllers::About;
sub get_all {
my $tabs = {
Home => {
action => \&Controllers::Dashboard::dashboard,
displayName => ‘Home’,
...
},
About => {
action => \&Controllers::About::info,
displayName => ‘About Us’,
...
},
...
};
return $tabs;
}
sub get_permitted {
my $user_permissions = shift;
my $tabs = get_all();
if (defined $user_permissions){
foreach my $tab (keys %$tabs){
delete $tabs->{$tab} unless $user_permissions->{"can_access_$tab"};
}
}
}
仪表板视图
package Views::Dashboard;
sub render {
my ($users,$tabs) = @_;
my $html_tabs = '<ul>';
foreach my $tab (values %$tabs){
$html_tabs .= "$tab->{displayName}";
}
$html_tabs .= '</ul>;
my $html = <<"END";
$html_tabs
<!-- dashboard content -->
END
return $html;
}