Symfony form POST handling


Symfony form POST handling

Symfony如何处理控制器的POST方法?例如,ASP.NET 中的这段代码可以以不同的方式为控制器使用完全相同的名称:

public ActionResult Create()
{
    return View();
}
 // POST: Objects/Create
 [HttpPost]
 [ValidateAntiForgeryToken]
 public ActionResult Create()
 {
     //Code here that only runs on POST method of a form
     return View();
 }

我见过这样的东西:

public function createAction()
{
    return $this->render('formPage.html.twig');
}
/**
* @Method({"POST"})
*/
public function createAction()
{
    //Some code...
    return new Response('Added item with id: ' . $item->getId() . 'to database');
}

后者是否可能并与前者相似?是否有必要使用这样的注释,或者也可以将其添加到路由中,如果是这样,我应该制作不同的路由名称或其他东西吗?

movie_create:
    path:     /movies/create
    defaults: { _controller: AppBundle:Movie:create }

您可以定义路由将接受的方法,根据您的示例或通过 routeting.yml 中的注释;

my_route:
    path:     /foo/bar/{id}
    defaults: { _controller: AppBundle:Fubar:foo }
    methods:  [POST]

这将只接受开机自检。

你不能定义两个同名的方法,这是 PHP 的一个限制。 在您的情况下,您可以有一个路由来显示表单,另一个路由来处理请求。

> Symfony2中的控制器是类,在这些类中,你不能重新定义具有相同名称的方法。

恐怕您需要将控制器一分为二:

class ViewController extends Controller {
    public function createAction()
    {
        return $this->render('formPage.html.twig');
    }
}
class CreateController extends Controller {
    /**
    * @Method({"POST"})
    */
    public function createAction()
    {
        //Some code...
        return new Response('Added item with id: ' . $item->getId() . 'to database');
    }
}

或者更简单的解决方案,只需在路由中重命名方法:

movie_view:
    path:     /movies/view
    defaults: { _controller: AppBundle:Movie:view }
movie_create:
    path:     /movies/create
    defaults: { _controller: AppBundle:Movie:create }
    requirements:
        _method: POST