我正在使用Symfony2,我有一个具有Rss实体的ReaderBundle。
我为这个实体创建了CRUD。
php app/console generate:doctrine:crud --entity=RSSReaderBundle:Rss --format=annotation --with-write
在我连接Cache之前一切都很顺利。
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppCache.php';
require_once __DIR__.'/../app/AppKernel.php';
Debug::enable();
$kernel = new AppKernel('dev' , true);
$kernel->loadClassCache();
$kernel = new AppCache($kernel); // THAT STRING IS MAIN PROBLEM
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
然后当我尝试删除某些记录时,我会收到此错误:
No route found for "POST /rss/delete/30": Method Not Allowed (Allow: DELETE)
我创建了一个清楚表明方法的表格:
405 Method Not Allowed
private function createDeleteForm($id)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('rss_delete', array('id' => $id)))
->setMethod("DELETE")
->add('submit', 'submit', array('label' => 'Delete'))
->getForm()
;
}
我没有发现问题。请帮忙
答案 0 :(得分:1)
自symfony2.2发生此问题,请参阅https://github.com/symfony/symfony-standard/commit/1970b831f8843a5cf551e9d88404cb62f21b90f9
您需要在app.php文件中手动修改Symfony\Component\HttpFoundation\Request::$httpMethodParameterOverride
布尔值:
// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
Request::enableHttpMethodParameterOverride();
答案 1 :(得分:0)
html表单中没有method="DELETE"
...至少在几乎所有浏览器中都不支持 - 仅在ajax请求中。
通过允许对路由的DELETE和POST请求解决此问题。
答案 2 :(得分:0)
我们必须删除带有“THAT STRING IS MAIN PROBLEM”的字符串。缓存工作原理完全相同。 CRUD工作正常
答案 3 :(得分:0)
我遇到了同样的问题(使用PUT和DELETE HTTP方法),但我不了解您的解决方案。
你有没有:解决方案b)与不使用缓存相同,所以在我的情况下,它没有帮助,因为页面需要很长时间才能加载。
@Nifr: 我以为有方法PUT和DELETE。我按照此链接上的说明在我的表单中使用它们:http://symfony.com/fr/doc/current/cookbook/routing/method_parameters.html 所以事实上,Symfony2能够判断方法是PUT,DELETE,POST还是GET。但不知何故,缓存可以......
对此有何帮助?
编辑: 我找到了一个解决方案,它不涉及更改app.php文件中的任何内容。 基本上,问题来自于symfony2的请求对象的getMethod方法不知道PUT或DELETE方法的事实。关键是要在AppCache.php文件中更改它。
我们只需要覆盖AppCache.php文件的方法无效:
protected function invalidate(Request $request, $catch = false)
{
$request->setMethod($request->request->get('_method'));
return parent::invalidate($request, $catch);
}
在这里,我只是通过从表单中发布的方法更改请求的方法。