顶级Symfony CMF上CMS的体系结构

时间:2015-09-18 16:37:52

标签: symfony-cmf

我在Symfony CMF Components / Bundles之上构建一个非常自定义的CMS。我几乎可以读到关于CMF组件/捆绑包的所有内容,并且我已经定义了“架构”。我经验丰富/熟悉Symfony2组件。

CMS应该提供管理多个站点的方法。 网站包含页面。 页面,需要标题,可能有内容。页面也可以包含关联的块(已经由Block Bundle提供的块,以及其他具有我为CMS开发的自定义功能的块)。

现在我定义了两个文件(网站和页面)。 基于应用程序要求我使用CoreBundle,BlockBundle,RoutingBundle,DoctrinePHPCRBundle和DoctrinePHPCRAdminBundle。

根据此要求,预期的存储库树应该类似于:

/sites
    /site1 ( nodename of the Site Document )
         /pages ( all pages of this site )
              /page1 ( nodename of a Page Document )
              /page2
         /routes ( all routes of this site )
    /site2
        /pages
  ...

CoreBundle的配置:

cmf_core:
        persistence:
            phpcr:
                basepath: /sites
                enabled: true

因为我需要每个站点的节点(/ pages,/ routes),我该如何初始化它们?我的第一个想法是在Site文档的onPostPersist事件中初始化所需的节点。

use PHPCR\Util\NodeHelper;

...

public function initSiteNodes(ManagerRegistry $registry, Site $site)
    {
        $session = $registry->getConnection();

        NodeHelper::createPath($session, $site->getId()./pages);
        NodeHelper::createPath($session, $site->getId()./routes);

        $session->save();
    }

所以我的问题是:

这种架构是否可行,是否为这种结构准备了SonataAdminBundle?

1 个答案:

答案 0 :(得分:2)

很高兴听到您在CMF之上构建自定义CMS。这是它的主要用途之一。

对于您的用例,需要注意的一件重要事情是route base paths can be an array of paths。如果您知道将存在的站点,则可以简单地为所有站点配置基本路径。

如果可以动态创建它们,则需要更多工作。您可以检查表达式语言是否可以帮助您,或者编写一个很早出现的symfony请求侦听器并在cmf_routing.phpcr_candidates_prefix服务上设置正确的基本路径。

sonata phpcr-odm admin并未真正针对多站点用例进行优化。但是,在权限系统的帮助下,您应该能够控制谁可以看到什么。

您也可以写信给symfony-cmf-users邮件列表。有几个人与CMF进行了多站点项目,可能还有其他想法或输入。如果您看到可以改进的内容,请随时在相应的CMF存储库上打开pull请求或问题。