【问题标题】:Is it possible to construct a Symfony path using only parameters?是否可以仅使用参数构建 Symfony 路径?
【发布时间】:2016-11-23 17:31:08
【问题描述】:

我想减少重复代码的数量并在我的 Drupal 8 应用程序中提供一个规范的 URL。由于路由系统是基于 Symfony 构建的,所以我将其包含在标题中。

我正在 mymodule.routing.yml 文件中的路由下构建路径。我想匹配第一个参数中指定数量的不同字符串,以及第二个参数中可以是任何字符串的 slug。它看起来像这样:

entity.my_entity.canonical:
  path: '/{type}/{slug}'
  defaults:
    _controller: '\namespace\PostController::show'
  requirements:
    _permission: 'perm'
    type: different|strings|that|can|match|

现在,当我尝试使用例如/match/some-slug 访问时,它只会显示“找不到页面”。 如果我的路径是静态的,例如path: '/j/{type}/{slug}',那么当我在浏览器中打开/j/match/some-slug 时它会按预期工作。

我的老板不喜欢 URL 中任何不必要的字符,所以我想通过使用两个参数来实现这一点,如第一个示例所示。

【问题讨论】:

  • 确保没有其他路径可能与之冲突,因为它完全可能。
  • 我怎么知道?如果另一个路径也有两个参数,或者只有参数名称相同,是否会被认为是冲突?
  • 使用php bin/console debug:router来调试你定义的路由,同时检查顺序

标签: php symfony drupal-8


【解决方案1】:

正如 Yonel 在 cmets 中提到的,您可以使用 debug:router 检查所有路由。我看不出你的代码有什么问题。

尝试运行bin/console router:match "/match/blaaa",如果您看到某些控制器不是您想要的,那么您需要更改路由。但情况并非如此,因为您得到的是 404。

这是我的确切设置

routing.yml:

entity.my_entity.canonical:
  path: '/{type}/{slug}'
  defaults:
    _controller: 'MyBundle:Something:foo'
  requirements:
    type: different|strings|that|can|match|

在 MyBundle\SomethingController 中:

public function fooAction($id)
{
  return new Response("bar");
}

然后转到http://localhost/match/fom 会显示“bar”响应。

【讨论】:

  • 感谢您的帮助,我现在发现这在 Drupal 8 中是不可能的。对于其他 Drupal 人员:获取路由列表的命令(使用 Drupal 控制台)是 drupal router:debug
【解决方案2】:

我再次阅读了文档(RTM),发现在 Drupal 8 中是不可能的,而在 Symfony 中是可能的。

注意,路径的第一项不能是动态的。

来源:Structure of routes in Drupal 8

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多