Background:
我试图根据请求主机有条件地加载路由 . 我有一个数据库设置,其中包含映射到模板的主机 . 如果用户从主机 A
进入并使用模板 TA
我想加载该模板的路由 . 如果他们从主机 B
进来,则加载该模板的路由( TB
) .
我必须这样做的原因是因为每个模板将共享许多路由 . 但是,给定模板有一些独特的路线 .
将每个模板路由限制到给定主机是可以的,除了实际上有1000个主机 .
What I Have Tried:
我已经尝试了一个自定义路由加载器,如下面的文档中所述:
http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html
但是当我配置服务并尝试注入 "@request"
时,构造函数失败,因为$ request为null
services:
acme_demo.routing_loader:
class: Acme\DemoBundle\Routing\ExtraLoader
arguments: ["@request"]
tags:
- { name: routing.loader }
类:
<?php
namespace: Acme\DemoBundle\Routing;
use Symfony\Component\HttpFoundation\Request;
class ExtraLoader
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
// ...
}
如果我尝试切换 "@request"
为 "@service_container"
然后调用,这也无法工作
$this->container->get('request');
我得到这个工作的最接近的是遵循这里找到的指南:
http://marcjschmidt.de/blog/2013/11/30/symfony-custom-dynamic-router.html
我有这个问题是我试图在控制器上使用 annotation
,我似乎无法得到 Symfony\Component\Routing\Loader\AnnotationFileLoader
工作 .
1 回答
好吧,我终于想出了一个有效的解决方案,它是上面提到的几个指南的混合体 .
我使用内核请求监听器:
听众:
关键部分是:
Loader
- 我在源代码中找到"@sensio_framework_extra.routing.loader.annot_dir"
. symfony默认使用的注释目录加载器也是我想要使用的那个 . 但是如果你想使用不同的装载机,还有其他装载机可用 .Router
- 这是我用来获取所有当前路线的方法 . NOTE$allRoutes->addCollection($routes)
呼叫是在一条单独的行上 . 我不知道为什么它会有所作为,但是把它全部称为1,就像没有工作一样 .$template['routes']
只是一个名称空间控制器引用,就像您在routing.yml中添加路由一样 . 类似的东西:"@NamespaceBundle/Controller"