Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在MVC中,在何处放置调度表?_Perl_Model View Controller_Dispatch Table - Fatal编程技术网

Perl 在MVC中,在何处放置调度表?

Perl 在MVC中,在何处放置调度表?,perl,model-view-controller,dispatch-table,Perl,Model View Controller,Dispatch Table,调度表(或调度方法)既是表(模型)又是路由器/控制器 设想一个选项卡式导航,其中可能有30个选项卡供不同的最终用户使用。每个选项卡本质上是一个具有自己的控制器和视图的页面。在我的例子中,调度表包含选项卡的键,然后是每个选项卡的数据(路径、显示名、可见性等) 最初我有一个TabController和TabView。控制器内有一个调度台;然而,它似乎并不符合MVC。当只有3个选项卡时,它看起来很好,但当它增长时就不同了,特别是当它需要安全性修剪或过滤视图时 将其移动到模型中是有意义的,因为它更多地被

调度表(或调度方法)既是表(模型)又是路由器/控制器

设想一个选项卡式导航,其中可能有30个选项卡供不同的最终用户使用。每个选项卡本质上是一个具有自己的控制器和视图的页面。在我的例子中,调度表包含选项卡的键,然后是每个选项卡的数据(路径、显示名、可见性等)

最初我有一个TabController和TabView。控制器内有一个调度台;然而,它似乎并不符合MVC。当只有3个选项卡时,它看起来很好,但当它增长时就不同了,特别是当它需要安全性修剪或过滤视图时

将其移动到模型中是有意义的,因为它更多地被视为一个数据表。但是,因为它是Perl(和一个分派表),所以还必须加载所有相应的包。因此,这个TabModel正在加载许多控制器(在某些情况下还有视图)。我并不特别喜欢加载/引用模型中的任何控制器,因此加载多个控制器感觉更糟

对于这种情况,是否有最佳实践或示例


补遗 试图提供一些更具体的东西。我将尝试围绕一个临时的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;
}