Perl 在MVC中,在何处放置调度表?
调度表(或调度方法)既是表(模型)又是路由器/控制器 设想一个选项卡式导航,其中可能有30个选项卡供不同的最终用户使用。每个选项卡本质上是一个具有自己的控制器和视图的页面。在我的例子中,调度表包含选项卡的键,然后是每个选项卡的数据(路径、显示名、可见性等) 最初我有一个TabController和TabView。控制器内有一个调度台;然而,它似乎并不符合MVC。当只有3个选项卡时,它看起来很好,但当它增长时就不同了,特别是当它需要安全性修剪或过滤视图时 将其移动到模型中是有意义的,因为它更多地被视为一个数据表。但是,因为它是Perl(和一个分派表),所以还必须加载所有相应的包。因此,这个TabModel正在加载许多控制器(在某些情况下还有视图)。我并不特别喜欢加载/引用模型中的任何控制器,因此加载多个控制器感觉更糟 对于这种情况,是否有最佳实践或示例Perl 在MVC中,在何处放置调度表?,perl,model-view-controller,dispatch-table,Perl,Model View Controller,Dispatch Table,调度表(或调度方法)既是表(模型)又是路由器/控制器 设想一个选项卡式导航,其中可能有30个选项卡供不同的最终用户使用。每个选项卡本质上是一个具有自己的控制器和视图的页面。在我的例子中,调度表包含选项卡的键,然后是每个选项卡的数据(路径、显示名、可见性等) 最初我有一个TabController和TabView。控制器内有一个调度台;然而,它似乎并不符合MVC。当只有3个选项卡时,它看起来很好,但当它增长时就不同了,特别是当它需要安全性修剪或过滤视图时 将其移动到模型中是有意义的,因为它更多地被
补遗 试图提供一些更具体的东西。我将尝试围绕一个临时的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
仪表板控制器
关于控制器
塔布斯莫尔
仪表板视图
包视图::仪表板;
子渲染{
我的($users,$tabs)=@;
我的$html_标签=“”;
foreach my$选项卡(值%$tabs){
$html_tabs.=“$tab->{displayName}”;
}
$html_tabs.='
;
我的$html=
结束
返回$html;
}
这是一个古老的问题,但它出现在今天的提要中
我认为你对事物进行分类的方式有些不可靠。模型通常是数据源,并不真正关心您如何处理它们或如何显示它们。但是,您已经将一些视图(表示)推送到了模型中。对我来说,Tabs.pm看起来应该是某些视图的一部分
而且,因为分派表是一个表,并不意味着它是一个数据源。这是一种解决与特定数据或特定视图无关的问题的特殊技术。如果您在没有调度表的情况下执行相同的任务,您不会突然将该职责转移到MVC的另一部分。古老的问题,但它今天出现在提要中
我认为你对事物进行分类的方式有些不可靠。模型通常是数据源,并不真正关心您如何处理它们或如何显示它们。但是,您已经将一些视图(表示)推送到了模型中。对我来说,Tabs.pm看起来应该是某些视图的一部分
而且,因为分派表是一个表,并不意味着它是一个数据源。这是一种解决与特定数据或特定视图无关的问题的特殊技术。如果您在没有dispatch表的情况下执行相同的任务,您不会突然将该职责转移到MVC的另一部分。您能用几个选项卡提取一个最小的运行示例吗?我很难找到模糊的描述。@daxim正如我在前面的评论中提到的,我理解这对一些人来说可能很难概念化,尽管这是一个概念性的问题。要包含一个完整的最小运行示例,这将是一项巨大的工作,但希望附录能够帮助更清楚地说明该场景。这个更新有用吗?我想它会妨碍我的问题,因为它会分散我对原始问题的注意力,这是关于一个调度表,它可能引用多个控制器,并且需要那些perl包,因为调度表存储对子例程的引用。你能用几个选项卡提取一个最小的运行示例吗?我很难找到模糊的描述。@daxim正如我在前面的评论中提到的,我理解这对一些人来说可能很难概念化,尽管这是一个概念性的问题。要包含一个完整的最小运行示例,这将是一项巨大的工作,但希望附录能够帮助更清楚地说明该场景。这个更新有用吗?我认为它妨碍了我的问题,因为它分散了原始问题的注意力,这个问题是关于可能引用多个控制器的调度表,并且需要那些perl包,因为调度表存储对子例程的引用。
index.pl -- entrance
Controllers/
-- Dashboard.pm
-- Home.pm
-- About.pm
Models/
-- Tabs.pm
-- Users.pm
Views/
-- Dashboard.pm
-- Home.pm
-- About.pm
-- Error.pm
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;
}