全局设置主机路由

时间:2014-11-06 16:06:48

标签: symfony routing

除非指定了主机,否则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

但我更愿意在全球范围内配置它。

有谁知道如何解决这个问题?

1 个答案:

答案 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%