首页 文章

Symfony,动态路由

提问于
浏览
2

我有一个symfony项目,有多个皮肤/模板,有自己的路线,有没有人有一个正确的设置的想法?

  • 每个皮肤/模板都是自己的捆绑包,因为它不仅仅是皮肤和资产,也可能是某些皮肤中可能存在的服务 .

  • 主机名决定皮肤 .

  • 使用自定义RouteLoader加载目标包的route.yml .

自定义RouteLoader完成工作 - 但生成的路由正在缓存,据我所知,没有办法阻止路由缓存 .

一些建议是:

  • 创建一个/ 路由,所以手动形成路由..但我不想丢弃路由器的那部分功能,或者重构整个项目..

  • 使用模板标识符作为路径的前缀 . 这将要求我加载所有route.yml文件,这是因为它们的共享路径是不可能的 .

任何人?我真的不能去多个项目,皮肤的数量将在20-30左右 .

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

3 回答

  • 1

    听起来你想根据主机名动态加载bundle?由于缓存,Symfony 2不会发生 . 特别是服务 .

    你最好的办法是为每个皮肤设置一个应用程序,然后做一些url majic来执行所需的app.php文件 . 显然,因为你已经为每个皮肤定义了一个包,所以有一个有限的数字,所以有多个应用程序应该不是很多或负担 .

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

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

  • 1

    我认为通过在内核请求上添加一个监听器,可以根据用户动态加载twig模板 .

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

    /**
             * 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

    希望它可以给你一个线索

  • 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 }
    

相关问题