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 }
答案 0 :(得分:2)
您可以根据示例或 routing.yml 中的注释定义路径接受的方法;
my_route:
path: /foo/bar/{id}
defaults: { _controller: AppBundle:Fubar:foo }
methods: [POST]
这将只接受POST。
您无法定义两个具有相同名称的方法,这通常是PHP的限制。在您的情况下,您可以有一个路径来显示表单,另一个路由来处理请求。
答案 1 :(得分:1)
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