Symfony2捆绑中的路由

时间:2015-11-09 09:08:37

标签: php symfony directory-structure

我有一个symfony项目,我将我的代码分成两个不同的包,比如HomeBundle和AppBundle,但是这两个路径通常都可以访问。

例如:HomeBundle中定义的/home也可以从AppBundle

访问

AppBundle中定义的

/App也可以从HomeBundle

访问

我想要的是仅从/homeHomeBundle仅从/App访问AppBundle我正在寻找'结构化'我的代码以一种方式,我不必编写任何逻辑来实现这一点,而是利用symfony框架结构来为我做这件事,就像限制路由到仅在捆绑中,或路由定义去的某种方式超出范围'在错误的包内

我正在使用注释进行路由,并在app / config / routing.yml中定义

编辑:应用程序需要子域分区,所以我也使用this host / default with placeholder

任何帮助将不胜感激:)谢谢

3 个答案:

答案 0 :(得分:2)

不幸的是,这是不可能的,主要是因为Symfony捆绑的架构。从认知的角度来看,将代码分成捆绑是很好的,但Symfony没有“捆绑”的概念;运行什么代码(特别是您的控制器操作)通常由路由处理,并且路由必须从ALL bundle一起编译,以确保可以成功路由请求。

你必须编写额外的代码来完成你所要求的 - 我最初的想法是你自己的Controller类(可能从FrameworkBundle\Controller\Controller扩展)在请求之前运行一些代码(参见documentation可能实现这一目标。)

从根本上说,这是一个架构决定,我的问题是 - 您为什么不希望能够从/home访问AppBundle?安全/角色设置是否也可以正常工作,或者您是否尝试使用沙盒代码?

编辑经过一些进一步的详细说明,结果表明该要求适用于同一网址路径的两种不同操作(例如/home),但在不同的域上,例如www.example.com/homesubdomain.example.com/home。在这种情况下,它不是代码共享而是URL,因此Symfony的host/domain based routing解决方案有效。

答案 1 :(得分:1)

我假设捆绑包中的业务逻辑是孤立的,并且不会“意识到”其他捆绑包内定义的路由,结果是所有捆绑包全局可用的路由,我想使用symfony的框架来实现我要求的是,它发生了,所以没有办法做到这一点。我可能应该使用Listeners或者在使用过滤器之前实现这一点。约翰诺埃尔回答了这个问题。

幸运的是,捆绑包恰好在不同的域上运行(一个在主域上,另一个在子域上)我注意到这与@John Noel聊天后他建议匹配基于主机/域的路由。我之前已经有了这个,第二次看我发现我必须 - 基于域重定向所有(除了白色路由列表)路由到控制器抛出404异常。这就是我的意思。

Home_restrict:
    path:     /{slug}
    host:     "{domain}"
    defaults:
        _controller: HomeBundle:Home:notfound
    requirements:
       domain: example.com|www.example.com
       slug: ^(?!.*(admin|login)$).*

页面上列表顶部显示的路径优先,因此应妥善放置

答案 2 :(得分:0)

您可以为每个捆绑添加routing.yml,并将其包含在您的" global"路由:

# src/HomeBundle/Resources/config/routing.yml
home:
    resource: "@HomeBundle/Controller/HomeController.php"
    type:     annotation

# src/AppBundle/Resources/config/routing.yml
home:
    resource: "@AppBundle/Controller/AppController.php"
    type:     annotation

然后在app/config/routing.yml中导入它们,甚至可能在那里加上前缀?

# app/config/routing.yml
app:
    resource: "@AppBundle/Resources/config/routing.yml"
    prefix:   /app