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 存储库上打开拉取请求或问题。
我正在 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 存储库上打开拉取请求或问题。