2016-02-19 74 views
0

Symfony如何处理控制器的POST方法?例如,下面的代码在ASP.NET能够为控制器使用完全类似的名字,以不同的方式:Symfony表单POST处理

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 } 

回答

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 
+0

阅读这些答案后,我想到了你的第二个解决方案。谢谢! – Barrosy

+0

您也可以将其保存在每个资源的一个控制器上。只需使用不同的操作名称和不同的请求方法即可。 –

2

您可以定义一个路由会接受什么样的方法,或者通过注释按您的例子或在的routing.yml;

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

这只会接受POST。

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

+0

你实际上可以在PHP中定义两个具有相同名称的方法,但它们需要位于不同的范围内才能避免碰撞。 – hasumedic