【问题标题】:Modular application structure in Symfony2Symfony2 中的模块化应用程序结构
【发布时间】:2016-10-20 12:45:28
【问题描述】:

我正在使用 Symfony2 构建一个具有模块化结构的税务局自助服务应用程序。

这些模块包含在单独的包中,例如 TaxBillsBundle、DirectDebitBundle 和 PersonalDataBundle。这些捆绑包包含前端/后端功能、实体等。

这个想法是让 AppBundle 将模块粘合在一起。现在,由于这是我在 Symfony2 中的第一个应用程序,我不知道如何处理。

这是应用程序的主屏幕:

每个图块代表一个模块。构成此屏幕的最佳方式是什么? AppBundle 负责显示图块,但不负责它们的内容。添加新模块时我不想触碰 AppBundle。

一位同事建议使用事件系统。 AppBundle 可以“广播”对图块内容的请求,模块(订阅者)可以响应该请求。一旦收集了所有 tile 内容,AppBundle 就可以组成页面。这是一个合理的方法吗?还有其他想法吗?

【问题讨论】:

    标签: symfony architecture modularity


    【解决方案1】:

    我建议在每个实现 symfony 事件调度器的非 AppBundle 包中使用订阅者类并向它们添加订阅者。

    http://symfony.com/doc/current/components/event_dispatcher.html

    【讨论】:

      【解决方案2】:

      如果它们是静态图块,我将在整个应用程序的视图目录中为每个图块创建一个树枝模板:app/Resources/views/modules/dashboard-tiles/module-x.html.twig 并将其包含在仪表板app/Resources/views/pages/dashboard.html.twig 视图文件中。如果它们的内容相似,您可以重构为使用单个 twig 模块文件并将数据传递给它:

      // DashboardController.php
      public function dashboardAction()
      {
          /** You could use an entity and create new objects for tiles instead of building an array like this. Or a method to return each one. **/
          $tiles = [];
          $tiles[] = [
              'name' => 'Personal Data',
              'links' => [
                   {
                       'text' => 'Show data',
                       'icon' => 'fa-user',
                       'href' => '#'
                   },
                   {
                       'text' => 'Edit data',
                       'icon' => 'fa-edit',
                       'href' => '#'
                   }
              ]
          ];
      
          return $this->templating->renderResponse(
              'PathTo/dashboard.html.twig', [ 'tiles' => $tiles ]);
      }
      
      // dashboard.html.twig
      {% for tile in tiles %}
          {% include 'modules/dashboard-tiles/tile.html.twig' with { 
              'tile': tile 
          } %}
      {% endfor %}
      
      # tile.html.twig
      <div class="tile">
          <h2>{{ name }}</h2>
          {% for link in links %}
              <a href="{{ href }}"><i class="fa {{ icon }}"></i> {{ text }}
          {% endfor %}
      </div>
      

      如果它们是动态的,我会在每个包中设置一个服务,并使用一个方法返回视图所需的数据,这些数据可以从您的控制器调用并发送到 twig。您可能希望使用依赖注入将服务获取到您的控制器中,然后这样使用它们:

      $tiles[] = $this->personalDataService->getDashboardTile();
      

      但看起来磁贴只是包含按钮,所以为什么不保持简单。

      【讨论】:

        猜你喜欢
        • 2015-12-08
        • 1970-01-01
        • 2016-07-29
        • 2010-11-27
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        相关资源
        最近更新 更多