zoukankan      html  css  js  c++  java
  • Symfony2创建基于域名的路由(原创翻译)

    你可以匹配将要来到的请求以HTTP域名的方式
    YAML方式
    mobile_homepage:
        path:     /
        host:     m.example.com
        defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    
    homepage:
        path:     /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
    XML方式
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="mobile_homepage" path="/" host="m.example.com">
            <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
        </route>
    
        <route id="homepage" path="/">
            <default key="_controller">AcmeDemoBundle:Main:homepage</default>
        </route>
    </routes>
    PHP方式
    use SymfonyComponentRoutingRouteCollection;
    use SymfonyComponentRoutingRoute;
    
    $collection = new RouteCollection();
    $collection->add('mobile_homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
    ), array(), array(), 'm.example.com'));
    
    $collection->add('homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:homepage',
    )));
    
    return $collection;
    两个路由匹配相同的路径  / ,然而第一个将只有域名为m.example.com才匹配
     
    使用占位符
     
    这个域名选项使用占位符的路径匹配系统。这样就意味着你可以在你的域名中使用占位符匹配的域名。
    YAML
    projects_homepage:
        path:     /
        host:     "{project_name}.example.com"
        defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    
    homepage:
        path:     /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
    XML
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="projects_homepage" path="/" host="{project_name}.example.com">
            <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
        </route>
    
        <route id="homepage" path="/">
            <default key="_controller">AcmeDemoBundle:Main:homepage</default>
        </route>
    </routes>
    PHP 
    use SymfonyComponentRoutingRouteCollection;
    use SymfonyComponentRoutingRoute;
    
    $collection = new RouteCollection();
    $collection->add('project_homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
    ), array(), array(), '{project_name}.example.com'));
    
    $collection->add('homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:homepage',
    )));
    
    return $collection;
    你还可以为这些占位符设置条件和默认的选项。列如,如果你想匹配  m.example.com 和mobile.example.com你可以按照如下方式
     YAML
    mobile_homepage:
        path:     /
        host:     "{subdomain}.example.com"
        defaults:
            _controller: AcmeDemoBundle:Main:mobileHomepage
            subdomain: m
        requirements:
            subdomain: m|mobile
    
    homepage:
        path:     /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
    XML
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="mobile_homepage" path="/" host="{subdomain}.example.com">
            <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
            <default key="subdomain">m</default>
            <requirement key="subdomain">m|mobile</requirement>
        </route>
    
        <route id="homepage" path="/">
            <default key="_controller">AcmeDemoBundle:Main:homepage</default>
        </route>
    </routes>
    PHP
    use SymfonyComponentRoutingRouteCollection;
    use SymfonyComponentRoutingRoute;
    
    $collection = new RouteCollection();
    $collection->add('mobile_homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
        'subdomain'   => 'm',
    ), array(
        'subdomain' => 'm|mobile',
    ), array(), '{subdomain}.example.com'));
    
    $collection->add('homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:homepage',
    )));
    
    return $collection;
    你还可以使用服务参数,如果你不想将域名写死写法如下
    YAML
    mobile_homepage:
        path:     /
        host:     "m.{domain}"
        defaults:
            _controller: AcmeDemoBundle:Main:mobileHomepage
            domain: '%domain%'
        requirements:
            domain: '%domain%'
    
    homepage:
        path:  /
        defaults: { _controller: AcmeDemoBundle:Main:homepage }
    XML
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="mobile_homepage" path="/" host="m.{domain}">
            <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default>
            <default key="domain">%domain%</default>
            <requirement key="domain">%domain%</requirement>
        </route>
    
        <route id="homepage" path="/">
            <default key="_controller">AcmeDemoBundle:Main:homepage</default>
        </route>
    </routes>
    PHP
    use SymfonyComponentRoutingRouteCollection;
    use SymfonyComponentRoutingRoute;
    
    $collection = new RouteCollection();
    $collection->add('mobile_homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:mobileHomepage',
        'domain' => '%domain%',
    ), array(
        'domain' => '%domain%',
    ), array(), 'm.{domain}'));
    
    $collection->add('homepage', new Route('/', array(
        '_controller' => 'AcmeDemoBundle:Main:homepage',
    )));
    
    return $collection;
    提示
        确保你总是包含了默认的选项 domain占位符,否则你需要包含 domain的值每当你使用该路由生成URL的时候。
     
    使用包含进来的路由规则匹配
     
     你可以设置域名选项通过导入路由配置文件,方式如下
    YAML
    acme_hello:
        resource: '@AcmeHelloBundle/Resources/config/routing.yml'
        host:     "hello.example.com"
    XML
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <import resource="@AcmeHelloBundle/Resources/config/routing.xml" host="hello.example.com" />
    </routes>
    PHP
    use SymfonyComponentRoutingRouteCollection;
    
    $collection = new RouteCollection();
    $collection->addCollection($loader->import("@AcmeHelloBundle/Resources/config/routing.php"), '', array(), array(), array(), 'hello.example.com');
    
    return $collection;
    域名 hello.example.com  将要被设置为加载进来的新路由配置文件中的每个路由
     
    测试你的Controllers
     
    你需要设置HTTP的域名头文件在你请求的对象中,如果你想正确的匹配到网址在你的测试函数中
     
    $crawler = $client->request(
        'GET',
        '/homepage',
        array(),
        array(),
        array('HTTP_HOST' => 'm.' . $client->getContainer()->getParameter('domain'))
    );
  • 相关阅读:
    技术面试之经验总结
    为何只有两篇文章?
    LOJ6364 烂柯
    mysql批量更新数据(性能优化)
    一个对象的key引发的血案
    总结与元素坐标相关的属性(再也搞不混了)
    利用nodejs搭建服务器,测试AJAX
    初探jquery之强大丰富的选择器
    Web前端开发规范手册
    IE8下标签float导致的bug。
  • 原文地址:https://www.cnblogs.com/tdalcn/p/5946446.html
Copyright © 2011-2022 走看看