symfony2 crud& http缓存

时间:2013-10-04 15:57:18

标签: caching symfony crud http-caching

我正在使用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()
        ;
    }

我没有发现问题。请帮忙

4 个答案:

答案 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方法),但我不了解您的解决方案。

你有没有:
a)摆脱//这是主要问题 或
b)摆脱$ kernel = new AppCache($ kernel); //这是主要问题

解决方案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);
}

在这里,我只是通过从表单中发布的方法更改请求的方法。