2015-11-03 93 views
0

我正在使用Symfony和FOSRestBundle创建一个REST API,而且这两者都非常新颖。FOSRestBundle,生成创建资源的URL

现在我想知道如何生成我刚刚创建的资源的URL。路线都设置这样的:

# app/config/routing.yml 

characters: 
    type:  rest 
    prefix: /api 
    resource: "@Optc/Resources/config/routing/characters_routing.yml" 

NelmioApiDocBundle: 
    prefix: /api/doc 
    resource: "@NelmioApiDocBundle/Resources/config/routing.yml" 
# Resources/Optc/Resources/config/routing/characters_routing.yml 

characters: 
    type:  rest 
    resource: Optc\Controller\CharactersController 

人物控制器,创建资源的一部分:

$character = new Character(); 
    $form = $this->createForm(new CharacterType(), $character); 
    $form->bind($data); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($character); 
     $em->flush(); 

     $response->headers->set('Location', $this->generateUrl('get_characters', array('id' => $user->getId()), true)); 

     $view = $this->view($character, 200); 
     return $this->handleView($view); 
    } 

更新:全控制器代码:

<?php 

namespace Optc\Controller; 

use FOS\RestBundle\Controller\Annotations\QueryParam; 
use FOS\RestBundle\Controller\FOSRestController; 
use Nelmio\ApiDocBundle\Annotation\ApiDoc; 
use Optc\Entity\Character; 
use Optc\Form\CharacterType; 
use Optc\HttpFoundation\File\Base64File; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\Exception\HttpException; 

/** 
* Characters Controller 
*/ 
class CharactersController extends FOSRestController 
{ 
    /** 
    * Get the list of characters. 
    * 
    * @param string $page integer with the page number (requires param_fetcher_listener: force) 
    * 
    * @return array data 
    * 
    * @QueryParam(name="page", requirements="\d+", default="1", description="Page number of the overview.") 
    * @ApiDoc() 
    */ 
    public function getCharactersAction($page) 
    { 
     $characters = $this 
      ->getDoctrine() 
      ->getRepository('Optc:Character') 
      ->findAll(); 

     $view = $this->view($characters, 200); 
     return $this->handleView($view); 
    } 

    public function getCharacterAction($id) 
    { 
     $character = $this 
      ->getDoctrine() 
      ->getRepository('Optc:Character') 
      ->findOneById($id); 

     if (!$character) { 
      throw new HttpException(404, sprintf('Character with id %d not found!', $id)); 
     } 

     $view = $this->view($character, 200); 
     return $this->handleView($view); 
    } 

    /** 
    * Create a new character. 
    * 
    * @param Request $request 
    * 
    * @return View view instance 
    * 
    * @ApiDoc() 
    */ 
    public function postCharacterAction(Request $request) 
    { 
     $data = $request->request->all(); 

     // If the request contains image date, first convert it from its base64 enconding to a real file 
     if ($request->request->has('image') && $request->request->get('id')) { 
      $imagePath = realpath($this->get('kernel')->getRootDir() . '/../web'.$this->container->getParameter('upload_path_characters')).'/'.$request->request->get('id'); 
      $file = Base64File::create($imagePath, $request->request->get('image')); 
      $data['image'] = $file; 
     } 

     $character = new Character(); 
     $form = $this->createForm(new CharacterType(), $character); 
     $form->bind($data); 

     var_dump($form->isValid()); 
     var_dump($form->getErrorsAsString()); 

     var_dump($this->generateUrl('get_characters', array('id' => $character->getId()), true)); 
     die(); 

     if ($form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($character); 
      $em->flush(); 

      $response->headers->set('Location', $this->generateUrl('acme_demo_user_get', array('id' => $user->getId()), true)); 

      $view = $this->view($character, 200); 
      return $this->handleView($view); 
     } 
     else { 

     } 
    } 
} 

的不像我预期的那样工作的是generateUrl部分设置位置标题。它吐出http://optc.local/api/characters?id = 2。这当然只会列出全部资源。但我想要的是http://optc.local/api/characters/2

我该怎么做?似乎我错过了一些简单的东西。

(顺便说一句,关于返回位置头是从http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/ PHP的一部分,所以我希望这是“正确”的方式。)

+0

PLZ转储控制器类这里的路线

,它似乎'的getAction ()方法没有'id'参数,当你将额外**参数**传递给路由时,它们转换为查询参数 – ghanbari

+0

@ghanbari添加了完整的控制器代码。它有一个'id'参数,但我不确定这是否足够。 – maryisdead

+1

请转储路由:console debug:router,我认为你必须使用'get_character'路由 – ghanbari

回答

1

必须使用的,而不是get_characters路线get_character路线,

我建议你是否实现ClassResourceInterface或使用RouteResource注释,可以使用方法名作为getActioncgetAction(这仅仅是一个建议)

+1

再次,谢谢! – maryisdead

1

你应该在终端检查app/console debug:router看什么名字symfony是命名在我的情况下,它使用的减,而不是下划线

get-character