首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2中的模块化应用程序结构

Symfony2中的模块化应用程序结构
EN

Stack Overflow用户
提问于 2016-10-20 20:45:28
回答 2查看 696关注 0票数 3

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

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

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

这是应用程序的主屏幕:

每个瓦片代表一个模块。合成此屏幕的最佳方式是什么?AppBundle负责显示磁贴,但不负责磁贴的内容。我不想在添加新模块时接触到AppBundle。

一位同事建议使用事件系统。AppBundle可以‘广播’对瓦片内容的请求,模块(订户)可以对该请求作出响应。一旦收集了所有的磁贴内容,AppBundle就可以组成页面了。这是一个合理的方法吗?还有其他想法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-10-21 15:51:07

我建议在每个非AppBundle包中使用一个subscriber类,实现symfony的事件分派器,并向其添加订阅者。

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-20 21:20:44

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

代码语言:javascript
复制
// 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。您可能希望使用依赖注入将服务放入控制器中,然后按如下方式使用它们:

代码语言:javascript
复制
$tiles[] = $this->personalDataService->getDashboardTile();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40154890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档