2

我有一个 symfony 项目,其中有多个皮肤/模板,它们有自己的路线,有人知道正确的设置吗?

  • 每个皮肤/模板都是它自己的捆绑包,因为它不仅是皮肤和资产,还可能是某些皮肤中可能存在的服务。
  • 主机名决定皮肤。
  • 使用自定义 RouteLoader 加载目标包的 route.yml。

自定义 RouteLoader 完成了这项工作——但是生成的路由被缓存了,据我所知,没有办法阻止路由缓存。

一些建议是:

  • 创建 /{dynamic} 路由,因此手动形成路由.. 但我不想丢弃路由器的那部分功能,或重构整个项目..
  • 使用模板标识符为路由添加前缀。这将需要我加载所有 route.yml 文件,因为它们的共享路径是不可能的。

任何人?我真的不能同时进行多个项目,皮肤的数量将在 20-30 左右〜。

此设置的原因是因为它是 Content-as-a-Service .. 服务的目标,多个客户将项目用作平台,他们的设置决定使用哪些模板。

4

3 回答 3

1

听起来您想根据主机名动态加载捆绑包?由于缓存,Symfony 2 不会发生。尤其是服务。

你最好的选择是为每个皮肤设置一个应用程序,然后做一些 url majic 来执行所需的 app.php 文件。显然,由于您已经为每个皮肤定义了一个捆绑包,因此数量有限,因此拥有多个应用程序不应该是太多或负担。

您可能能够解决模板问题。您仍然需要加载所有皮肤包,但您可以使用模板名称或路径来解决问题,并且可能会得到一些工作。

但是服务?除非您开始将主机名附加到服务 ID,否则我看不到任何解决方法。

于 2015-11-06T15:46:36.473 回答
1

我认为可以通过在内核请求上添加侦听器来根据您的用户动态加载树枝模板。

我可以给你一段代码,希望对你有帮助:

        /**
         * On Kernel Request triggers the request to get the user config
         * then adds TWIG paths depending on user TemplateName
         */
        public function onKernelRequest(GetResponseEvent $event)
        {
            if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
                return;
            }
            //$userConfig = Retrieve your user config
            if (null === $userConfig->getTemplateConfig()->getTemplate()->getName()) 
            {
                throw new TemplateConfigNotFoundException(sprintf("Could not find TemplateConfig for %s", $userConfig->getName()));
            }

            $template = $userConfig->getTemplateConfig()->getTemplate()->getName();

            $path = sprintf('%s/../../%s/Resources/views', __DIR__, ucfirst($template));

            if (!is_dir($path)) {
                throw new TemplateNotFoundException(sprintf("Could not find template %s", $template));
            }

            $this->loader->prependPath($path);
            $this->loader->addPath(sprintf('%s/../Resources/views/Default', __DIR__));
       }

在您的 Listener 构造函数中将 $this->loader 定义为 \Twig_Loader_Filesystem

希望它能给你一个线索

于 2015-11-06T16:46:14.693 回答
0

Symfony2 已经支持开箱即用的主机感知路由,如下所示:

website_customer_1:
    path:     /
    host:     customer1.example.com
    defaults: { _controller: Customer1Bundle:Main:startPage, theme: template1 }

website_customer_2:
    path:     /
    host:     customer2.example.com
    defaults: { _controller: Customer1Bundle:Main:startPage, theme: template2 }
于 2015-11-06T15:41:24.667 回答