除非指定了主机,否则AFAIK Symfony2对路由主机无动于衷。
我目前在我的应用中没有使用子域名,但这会发生变化。我想要的是,当主机(http://subdomain.foo.bar)中存在子域时,如果路由配置在主机中有子域,则路由器仅匹配路由。
这应匹配:(它确实如此)
/**
* @Route("/", host="{subdomain}.%host%")
* @Template
*/
public function index()
这不应该匹配并返回404:
/**
* @Route("/")
* @Template
*/
public function index()
由于上述无差异,此路线也与http://subdomain.foo.bar
匹配所以我想要的是全局设置主机要求(foo.bar),然后指定当子域存在时它们也应该匹配的特定路由。
我尝试将主机要求添加到app/config/routing.yml
中的导入:
foo:
resource: "@AcmeFooBundle/Controller/"
type: annotation
host: foo.bar
prefix: /
但是,主机要求从注释中指定的要求“获胜”,导致在实际主机中存在子域时,两条路线中的任何一条(如上所述)都不匹配。
根据控制器设置主机名的工作原理是什么:
/**
* @Route(host="foo.bar")
*/
class bazController
但我更愿意在全球范围内配置它。
有谁知道如何解决这个问题?
答案 0 :(得分:2)
我通过创建自定义路由编译器来修复此问题:
use Symfony\Component\Routing\RouteCompiler as BaseRouteCompiler;
use Symfony\Component\Routing\Route;
class RouteCompiler extends BaseRouteCompiler
{
public static function compile(Route $route)
{
if ($route->getHost() === "") {
$route->setHost($route->getDefaults()['default_host']);
}
return parent::compile($route);
}
}
然后在您的路由文件中:
foo:
resource: "@BarBundle/Controller/"
type: annotation
prefix: /
options:
compiler_class: Foo\Bundle\CoreBundle\Router\RouteCompiler
defaults:
default_host: %router.request_context.host%