构建应用程序,使其模块化


Structuring an application so that it is modular

我正在尝试实现以下场景的解决方案:

我有一个应用程序,允许某人管理他们的地址簿/客户列表。(MODULE CLIENTS)

使用这个的人可能需要一个链接到客户端的工作列表。(MODULE JOBS)

其他人可能需要一个链接到客户端和作业的属性列表。(MODULE PROPERTIES)

有没有办法让你可以:

在新安装中删除CLIENTSJOBS模块,然后它们可以通信

在新安装中删除CLIENTS, PROPERTIESJOBS模块,然后它们可以通信(client -> properties -> jobs per property或client -> jobs)

,甚至删除CLIENTSPROPERTIES模块在一个新的安装与客户端/作业类似的场景。

我知道我必须在某个地方定义关系,但我正试图构建它,以便我可以通过标准关系控制器(以及最好放置它们的地方)或通过配置文件做到这一点。

我不是一个纯粹主义者,所以我很高兴在模块中添加额外的控制器,但我只是想简化流程。

或者更好地产生"填充"模块,弥合差距,并用它们来构造视图??

我也想知道如何最好地构建视图-我现在拥有它的方式是有一个视图,然后'pagelets'是该视图的各个组件(表,表单等-每一个pagelet) ->我只是通过Module::运行调用pagelets(如果你习惯编码->基本上与'include'相同)->这是伟大的,但可能不是上面场景的最佳系统。

提前感谢!

模块布线

除非你正在使用一个HMVC框架,可以"智能"处理这种风格的(模块)链接,否则你需要以某种方式"配置"或"连接"它。虽然我不知道有任何HMVC框架可以做到这一点,但我可以想象,如果有的话,你需要将你的控制器编程为某种形式的"接口"(术语使用松散),这样它就知道它们是如何连接起来的。

使用"非智能"框架,需要使用全局配置文件或以某种形式(如yaml, xml, php等)的模块配置文件来解释模块之间的链接。同样,我不知道有这样一个HMVC框架。

总而言之,这将是一个伟大的项目,它肯定会推动HMVC框架世界进一步发展,尽管我确实怀疑这样做可能会在编程控制器的方式上失去一些灵活性,主要是因为语言(参数)每个模块需要实现与另一个(控制器)对话或接口。

<<p> 填充模块/strong>

我和其他框架(MVC和HMVC)的首选方法是有一个路由匹配到主控制器(你的"填充"模块)。然后,主控制器调用它的子控制器(模块),如果需要的话,调用子控制器(更多的"填充"模块),等等,收集数据,填充它的视图,然后向上工作(必要时再次返回),直到主视图可以填充。

我已经创建了我自己的HMVC框架,用我的基于Kohana框架的"请求"类来做到这一点。这个TechPortal链接以一种详细而易懂的方式描述了它是如何工作的。

您的视图(或'pagelets')的架构听起来是正确的。我称之为面板。因此,使用输出缓冲:

  1. 主控制器"请求"一个子控制器(如果需要,可以传递给它任何参数),子控制器的响应设置为一个变量。如:

    // Create a new request to a controller.
    $request = RequestFactory::createRequest();
    $request->controller('modules/customers/customers/controllers/CustomersController@showAllAddEditDelete');
    $currentCustomers = $request->execute();
    
  2. 子控制器收集任何必要的数据,将其呈现在页面中并返回。

    // Instantiate the view object.
    $view = new View();
    // Instantiate the customers model.
    $customersModel = new CustomersModel();
    // Set the data.
    $view->data('customers', $customersModel->getCustomers(), false);
    // Set the template.
    $view->template('modules/customers/customers/views/show_add_edit_delete');
    return $view->render(false);
    
  3. 主控制器然后准备它的数据并呈现它的视图。

    // Instantiate the view object.
    $view = new View();
    // Set the panels.
    $view->data('panel_1', $currentCustomers, false);
    // Set the panels layout.
    $view->partial('panels', 'views/html/secure/templates/panels/layout_2');
    // Set the template.
    $view->template('views/html/secure/templates/application.php');
    // Render the page.
    $view->render();
    

这个过程可以像你需要的那样深入(嵌套)。