Silex 中的挂载操作 - 附加斜杠

Sma*_*ndy 4 php symfony silex

我有一个在 Silex Framework 中开发的小型后端。我尝试使这个请求在 POST 上工作:

http://localhost/feedback/other

但是当使用挂载操作时,只有这个请求有效:

http://localhost/feedback/other/

如您所见,我必须在请求中添加一个额外的尾部斜杠。

以下是一些无法按预期工作的代码:

//index.php
$app->mount("/other", new FeedbackOther());

//FeedbackOther.php
$feedbackOther->get("/", "FeedbackOtherController::index")->bind('other');
$feedbackOther->post("","FeedbackOtherController::store");
Run Code Online (Sandbox Code Playgroud)

如果我做类似的事情

//index.php
$app->post('/other', "FeedbackOtherController::store");
$app->mount("/other", new FeedbackOther());

//FeedbackOther.php
$feedbackOther->get("/", "FeedbackOtherController::index")->bind('other');
Run Code Online (Sandbox Code Playgroud)

POST 请求无需附加斜杠即可工作,但在这种情况下,我看不到使用挂载操作的意义。

我也试过使用 .htacces 重写,但重写规则在 GET 中转换了 POST 请求。

Art*_*iel 5

挂载路由集合和简单地将路由限制到post. 添加mount意味着正在特定命名空间下创建路由集合,在您的情况下是/other. 这意味着此命名空间的默认 URL 将是/other/- 尾随斜杠也是必需的。当您将路由定义为特定方法时,这不适用,例如post. 总之-这是在这两个预期的行为Silex,并Symfony为好。前阵子在 github 上有一个关于这个的激烈讨论,所以让我复制/粘贴 Fabien 留下的笔记(作者):

让我解释一下挂载路由的当前行为,以便大家理解这个线程中几个人解释的行为(这种行为与 Symfony 中的行为相同,因此也适用于 Symfony)。

最简单的 URL 可能是 /(空 URL 没有任何意义,浏览器会默默地将其转换为 /,因此当您请求http://google.com 时,实际请求是针对http://google.com/ 的) .

当您在前缀下挂载路由集合时,Silex/Symfony 会为这些 URL 创建一个新的“命名空间”。当你在路由集合中定义/然后挂载到/foo下时,访问这个路由的URL是/foo/。在这种情况下请求 /foo 没有意义。

因此,截至今天,在 /foo 下挂载路由集合时,无法为 /foo 定义回调。我可以看到当前行为的局限性,但我想不出一个不会让人觉得很黑的可能的解决方案。

如果您对整个故事感兴趣 -就是引用的地方。