Symfony形式POST处理

时间:2016-02-19 12:51:27

标签: php symfony

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 }

2 个答案:

答案 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