在Silex中安装操作 - 附加的斜杠

时间:2015-06-26 09:16:38

标签: php symfony silex

我在Silex Framework中开发了一个小后端。 我试着让这个请求在POST上运行:

  

http://localhost/feedback/other

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

  

http://localhost/feedback/other/

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

以下是一些没有按预期工作的代码:

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

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

如果我做的话

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

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

POST请求在没有额外斜杠的情况下工作,但在这种情况下,我没有看到使用挂载操作的重点。

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

1 个答案:

答案 0 :(得分:4)

安装路线集合并简单地将路线限制为mount之间存在差异。添加/other意味着在特定名称空间下创建了一组路由,在您的情况下为/other/。意味着此命名空间的默认URL为post - 也需要尾随斜杠。当您定义到特定方法的路由时,这不适用,例如Silex。简而言之 - 这也是Symfony和{{1}}中的预期行为。不久之前在github上对此进行了大量讨论,所以让我复制/粘贴Fabien留下的笔记(作者):

  

让我解释已安装路由的当前行为,以便每个人都能理解这个线程中几个人解释的行为(这个行为与Symfony中的行为相同,因此它也适用于Symfony)。

     

最简单的URL可能是/(空URL不代表任何内容,并且由浏览器静默转换为/,因此当您请求http://google.com时,实际请求是http://google.com/)。< / p>      

在前缀下挂载路由集合时,Silex / Symfony会为这些URL创建新的“命名空间”。在路径集合中定义/然后将其安装在/ foo下时,访问此路由的URL为/ foo /。在这种情况下请求/ foo没有意义。

     

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

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