2016-02-19 76 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