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

时间:2014-06-20 16:07:52

标签: php model-view-controller architecture hmvc

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

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

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

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

有没有办法让你可以字面意思:

CLIENTSJOBS模块放入全新安装中,然后他们可以进行通信

CLIENTSPROPERTIESJOBS模块放入全新安装中,然后他们可以进行通信(客户端 - >属性 - >每个属性的作业或客户端 - >作业)

甚至将CLIENTSPROPERTIES模块放在全新安装中,其方案与客户端/作业类似。

我知道我必须在某处定义关系,但我正在尝试构建它,以便我可以通过标准关系控制器(以及最好放置它们)或通过配置文件来实现。

我不是纯粹主义者,所以我很乐意在模块中删除额外的控制器,但我只想简化流程。

或者生产'填料'那些弥合差距并用它们构建视图的模块??

我也想知道如何最好地构建视图 - 我现在拥有它的方式是查看视图,然后是小册子'这是该视图的各个组成部分(表格,表格等 - 每一个都是一个小页面) - >我只是通过Module :: Run来调用pagelet(如果你习惯于codeigniter - >基本上与' include'相同) - >这很好,但可能不是上述场景的最佳系统。

提前致谢!

1 个答案:

答案 0 :(得分:0)

模块接线

除非您使用能够智能化的HMVC框架。处理这种(模块)链接的风格,你需要配置'或者' wire'它在某种程度上。虽然我不知道任何可以做到这一点的HMVC框架,但我想如果有人做了,你需要将你的控制器编程为某种形式的接口' (松散地使用术语)所以它知道它们是如何联系在一起的。

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

所有这一切,这将是一个伟大的项目,它肯定会进一步推动HMVC框架世界,虽然我怀疑这样做可能会失去一些灵活性的方式你编程你的控制器主要是因为语言(参数)每个模块需要实现与另一个(控制器)进行通信或接口。

填充程序模块

我的首选方法和其他框架(MVC和HMVC)的方法是使路由匹配主控制器(您的'填充模块)。然后,主控制器调用它的子控制器(模块),如果需要子控制器(更多'填充模块)等,则收集数据,填充它。视图然后返回(并在必​​要时再次返回)直到可以填充主视图。

我已经创建了自己的HMVC框架,可以通过我的“请求”来实现这一目标。基于Kohana框架的类。此TechPortal链接以详细且易于理解的方式描述了它的工作原理。

<强>视图

您的观看结构(或&#39; pagelets&#39;)听起来是正确的。我把它们称为面板。因此,使用输出缓冲

  1. 主控制器&#39;请求&#39;子控制器(如果需要,传递给它的任何参数),子控制器响应设置为变量。例如:

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

    // 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();
    
  4. 此过程可以根据需要深入(嵌套)。

    我希望这会有所帮助。