捆绑包中的 Symfony2 路由

Symfony2 Routing within a bundle

我有一个 symfony 项目,我将我的代码分成两个不同的包,假设是 HomeBundle 和 AppBundle,但是在两个包中通常可以访问路由。

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

访问

/App 在 AppBundle 中定义也可以从 HomeBundle

访问

我想要的是仅从 HomeBundle 访问 /home 和仅从 AppBundle 访问 /App 我正在寻找 'structuring' 我的代码我不必编写任何逻辑来完成此操作的方式,而是利用 symfony 框架结构为我执行此操作,类似于将路由限制在捆绑包内,或者路由定义的某种方式 'out of scope' 当在错误的包内时

im 使用注释进行路由,并在 app/config/routing.yml

中定义

编辑:应用程序需要子域分区,所以我也在使用 this host/default 和占位符

如有任何帮助,我们将不胜感激 :) 谢谢

不幸的是,这是不可能的,主要是因为 Symfony 包的架构。虽然从认知的角度来看,将您的代码分成多个包是件好事,但 Symfony 并没有 "in" 一个包的概念; 运行 是什么代码(特别是你的控制器操作)通常由路由处理,路由必须从所有包一起编译以确保请求可以成功路由。

您将不得不编写额外的代码来完成您的要求 - 我最初的想法是您自己 Controller class(可能从 FrameworkBundle\Controller\Controller 扩展)运行 请求前的一些代码(参见 documentation 可能实现此目的)。

从根本上说,这是您的架构决策,我的问题是 - 为什么您不想从 AppBundle 访问 /home?安全/角色设置是否也有效,或者您是否正在尝试沙盒代码?

EDIT 经过一些进一步的详细说明,事实证明要求是针对同一 URL 路径(例如 /home)执行两个不同的操作,但是在不同的领域,例如www.example.com/homesubdomain.example.com/home。在这种情况下,它不是关于代码共享,而是 URL,所以 Symfony 的 host/domain based routing 解决方案起作用了。

您可以为每个捆绑包添加一个 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

我假设 bundle 内的业务逻辑是隔离的,不会是 'aware' 在其他 bundle 内定义的路由,事实证明这些路由对所有 bundle 都是全局可用的,我想使用该框架symfony 实现我所要求的,它发生了所以没有办法做到这一点。我可能应该使用监听器或过滤器之前等来实现这一点。 John Noel 回答了这个问题。

对我来说幸运的是,这些捆绑包恰好在不同的域上运行(一个在主域上,另一个在子域上)我在与@John Noel 聊天后注意到了这一点,他建议匹配基于 Host/Domain。我以前有过这个,再看一眼我发现我必须基于域将所有(路由白名单除外)路由重定向到抛出 404 异常的控制器。这就是我的意思。

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

出现在页面列表顶部的路线优先,因此应适当放置