捆绑包中的 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/home
和 subdomain.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)$).*
出现在页面列表顶部的路线优先,因此应适当放置
我有一个 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/home
和 subdomain.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)$).*
出现在页面列表顶部的路线优先,因此应适当放置