【问题标题】:Set host globally for routes为路由全局设置主机
【发布时间】:2014-11-06 16:06:47
【问题描述】:

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

但我更愿意在全局的某个地方进行配置。

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

【问题讨论】:

    标签: symfony routing


    【解决方案1】:

    我通过创建自定义路由编译器解决了这个问题:

    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%
    

    【讨论】:

    • 针对每个请求编译路由的效率如何。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2018-01-19
    • 2011-04-22
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多