Top Symfony CMF 上的 CMS 架构

Architecture of CMS on Top Symfony CMF

我正在 Symfony CMF 之上构建一个非常自定义的 CMS Components/Bundles。我几乎阅读了关于 CMF Components/Bundles 的所有内容,并且我已经定义了 "architecture"。我 experienced/familiarized 使用 Symfony2 组件。

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

现在我定义了两个文档(站点和页面)。 基于我使用 CoreBundle、BlockBundle、RoutingBundle、DoctrinePHPPCRBundle 和 DoctrinePHPPCRAdminBundle 的应用需求。

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

/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

因为我需要每个站点的节点(/页面,/路由),我该如何初始化它们?我的第一个想法是我初始化所需节点的站点文档的 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是为这样的架构准备的吗?

很高兴听到您正在 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 存储库上打开拉取请求或问题。