我在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?
答案 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请求或问题。