我有一个symfony项目,我将我的代码分成两个不同的包,比如HomeBundle和AppBundle,但是这两个路径通常都可以访问。
例如:HomeBundle中定义的/home
也可以从AppBundle
和
AppBundle中定义的 /App
也可以从HomeBundle
我想要的是仅从/home
和HomeBundle
仅从/App
访问AppBundle
我正在寻找'结构化'我的代码以一种方式,我不必编写任何逻辑来实现这一点,而是利用symfony框架结构来为我做这件事,就像限制路由到仅在捆绑中,或路由定义去的某种方式超出范围'在错误的包内
我正在使用注释进行路由,并在app / config / routing.yml中定义
编辑:应用程序需要子域分区,所以我也使用this host / default with placeholder
任何帮助将不胜感激:)谢谢
答案 0 :(得分:2)
不幸的是,这是不可能的,主要是因为Symfony捆绑的架构。从认知的角度来看,将代码分成捆绑是很好的,但Symfony没有“捆绑”的概念;运行什么代码(特别是您的控制器操作)通常由路由处理,并且路由必须从ALL bundle一起编译,以确保可以成功路由请求。
你必须编写额外的代码来完成你所要求的 - 我最初的想法是你自己的Controller
类(可能从FrameworkBundle\Controller\Controller
扩展)在请求之前运行一些代码(参见documentation可能实现这一目标。)
从根本上说,这是一个架构决定,我的问题是 - 您为什么不希望能够从/home
访问AppBundle
?安全/角色设置是否也可以正常工作,或者您是否尝试使用沙盒代码?
编辑经过一些进一步的详细说明,结果表明该要求适用于同一网址路径的两种不同操作(例如/home
),但在不同的域上,例如www.example.com/home
和subdomain.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