【问题标题】:Symfony, dynamic routingSymfony,动态路由
【发布时间】:2016-02-07 18:29:21
【问题描述】:

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

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

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

一些建议是:

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

有人吗?我真的不能多项目,皮肤的数量在20-30左右。

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

【问题讨论】:

标签: php symfony symfony-routing


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

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

        /**
         * 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__));
       }

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

希望能给你一个提示

【讨论】:

    【解决方案3】:

    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 }
    

    【讨论】:

    • 我应该更清楚,抱歉。 “主机名决定皮肤”,我的意思是:有一个数据库关系告诉哪个客户端使用哪个皮肤。所以它需要至少 1 个数据库查询来确定要使用哪个捆绑包。主机名和捆绑包之间没有直接联系:(
    • 如果我使用参数作为主机选项,我实际上可以这样解决它,但我只需要动态填充这些参数
    • 那么,路由事件之后的额外监听器可能会起作用?甚至您拥有 ControllerResolverListener?不清楚您是否将所有控制器复制到客户捆绑包中?
    • 试过了,但是你处理的是参数包被冻结,无法调整。只有在编译容器之前才有可能。然后我必须开始处理服务......我认为我坚持为每个皮肤单独的项目/
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2012-12-16
    • 2017-11-01
    • 2016-02-07
    相关资源
    最近更新 更多