1

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

想象一个选项卡式导航,其中可能有 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;
}
4

1 回答 1

0

古老的问题,但它今天出现在提要中

我认为你对事物进行分类的方式有些奇怪。模型通常是数据源,并不真正关心您如何处理它们或如何显示它们。但是,您已经将一些视图(表示)推送到模型中。对我来说,那个 Tabs.pm 看起来应该是某些视图的一部分。

而且,因为调度表是表并不意味着它是数据源。这是一种解决与特定数据或特定视图无关的问题的特殊技术。如果您在没有调度表的情况下执行相同的任务,您就不会突然将该责任转移到 MVC 的另一部分。

于 2021-04-26T21:04:47.007 回答