【问题标题】:Route variables without preceding slash in SymfonySymfony 中不带斜线的路由变量
【发布时间】:2014-09-24 10:32:37
【问题描述】:

我正在使用 Symfony 2.3。

目前我正在调整我的 routing.yml 以使用我在 parameters.yml 中定义的变量。我为每个客户/项目选择一个参数,但有时我需要它为空。

默认情况下(我猜),SF 确实需要在变量前加上斜杠。

这是我目前工作的routing.yml

index:
    path:      /{_namespace}/
    defaults:
      _controller: AppBundle:User:index
      _namespace: %namespace%
    methods:  [GET]

welcome:
    path:      /{_namespace}/welcome
    defaults:
      _controller: AppBundle:User:welcome
      _namespace: %namespace%
    methods:  [GET]

还有我的 parameters.yml

parameters:
    # [....]
    namespace: 'project1'

这让我可以生成如下 URL:

http://www.domain.com/project1/

http://www.domain.com/project1/welcome

但是,就像我之前所说的,我确实需要这样的路线:

http://www.domain.com/

http://www.domain.com/welcome

为此,我尝试了以下方法(注意前面的斜线除外):

routing.yml:

index:
    path:      {_namespace}/
    defaults:
      _controller: AppBundle:User:index
      _namespace: %namespace%
    methods:  [GET]

welcome:
    path:      {_namespace}/welcome
    defaults:
      _controller: AppBundle:User:welcome
      _namespace: %namespace%
    methods:  [GET]

parameters.yml:

parameters:
    # [....]
    namespace: ''

并且出现异常:

[Symfony\Component\Config\Exception\FileLoaderLoadException]                 
Cannot import resource "/home/cupaofarmacia/src/Ongagement/AppBundle/Resour  
ces/config/routing.yml" from "/home/project/app/config/routing.yml".   
(Malformed inline YAML string ({_namespace}/) at line 51 (near "path:        
{_namespace}/").)                                                            

[Symfony\Component\Yaml\Exception\ParseException]                            
Malformed inline YAML string ({_namespace}/) at line 51 (near "path:      {  
_namespace}/").    

我真的需要能够在路由开始时传递一个空变量。

有什么建议吗?

【问题讨论】:

  • 如果保留斜线并为_namespace提供默认值,则可以生成您提到的路由。
  • 但是我的默认值需要为空,这会生成一个类似“//welcome”的url。
  • 需要为空是什么意思?你不能只为它提供一个占位符吗?如果你这样做了,那么前面的斜杠将被忽略,它将是“/welcome”。
  • 好吧,占位符就是 {_namespace},但是传递一个空参数给它会导致错误的 url。

标签: php symfony routing yaml symfony-2.3


【解决方案1】:

不确定 Symfony2 中是否有条件路由之类的东西。我的建议是为命名空间为空的情况创建一个特定的路由。

#_namespace not empty
welcome:
    path:      /{_namespace}/welcome
    defaults:
      _controller: AppBundle:User:welcome
      _namespace: %namespace%
    methods:  [GET]

#namespace empty
welcome2:
    path:      /welcome
    defaults:
      _controller: AppBundle:User:welcome
    methods:  [GET]

注意到占位符及其默认值现在不存在。

在控制器或视图中,您只需检查参数 _namespace 的值并调用其中一个路由。

//If you use the route in the controller, with generateUrl fonction for example

$namespace= $this->container->getParameter('_namespace');
if($namespace!= '') { //use welcome }
else { //use welcome2 }

如果你使用视图中的路线,做树枝对应。

希望对你有帮助。

【讨论】:

  • 您好 Kaem,感谢您的回答,但是重复路线并不是我真正的计划。我想我会坚持使用命名空间的通用关键字。非常感谢!
猜你喜欢
  • 2014-07-27
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多