2013-11-22 2 views
0

Я использую FOSRestBundle для создания приложения REST, но поскольку функции REST являются только частью, я также использую некоторые встроенные средства автоматизации Symfony2 для генерации кода CRUD. Все работает нормально, но я не могу правильно отобразить маршрут, и я поразмыслил над тем, как это сделать вручную. Я прочитал руководство по определению маршрута в руководстве FOS, чтобы использовать данные аннотации, но как это сделать, поскольку код CRUD, созданный Symfony2, использует другую аннотацию?Как использовать ручные маршруты FOSRestBundle с CRUD от Symfony2?

Вот пример:

class UserController extends Controller 
{ 

    /** 
    * Lists all User entities. 
    * 
    * @Route("/", name="user") 
    * @Method("GET") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entities = $em->getRepository('CompanyWebServicesBundle:User')->findAll(); 

     return array(
      'entities' => $entities, 
     ); 
    } 

FOSRest руководство дает аннотацию к ГЭТ как use FOS\RestBundle\Controller\Annotations\Get;

/** 
* GET Route annotation. 
* @Get("/likes/{type}/{typeId}") 
*/ 

Когда я использую маршрут как /index, он дает мне ошибку и мое определение маршрута в config.yml:

index: 
    type: rest 
    resource: Company\WebservicesBundle\Controller\UserController 

Как я могу исправить эту проблему?

ответ

1

Если бы я был вами, я бы создал отдельные пакеты для контроллеров REST и ваших общих CRUD-контроллеров. Это упростит работу (на мой взгляд). Например, создайте AcmeMainBundle и AcmeRestBundle, а затем создайте отдельный класс, чтобы фактически выполнять действия, которые вы будете вызывать из обоих пакетов. Что-то вроде этого:

// src/Acme/MainBundle/Crud/User.php (create this folder structure) 

class User{ 
    private $em; 

    public function __construct($em){ 
     $this->em = $em; 
    } 

    public function getUser($id){ 
     return $this->em->getRepository('AcmeMainBundle:User')->find($id); 
    } 
} 

Тогда:

// src/Acme/MainBundle/Controller/UserController.php 

use Symfony\Component\HttpFoundation\Request; 
use Acme\MainBundle\Crud\User; 

class UserController extends Controller { 
    public function getAction($request){ 
     $em = $this->getDoctrine()->getManager(); 
     $getUser = new User($em); 
     $user = $getUser ->getUser($request->query->get('user_id')); 

     // return response 
    } 
} 

И потом:

// src/Acme/RestBundle/Controller/UserController.php 

use FOS\RestBundle\Controller\Annotations as Rest; 
use FOS\RestBundle\Routing\ClassResourceInterface; 
use Symfony\Component\HttpFoundation\Request; 

class UserController extends Controller implements ClassResourceInterface { 
    /** 
    * @Rest\View() 
    */ 
    public function getAction($id){ 
     $em = $this->getDoctrine()->getManager(); 
     $getUser = new User($em); 
     $user = $getUser ->getUser($id); 

     // return using the default format defined in config.yml 
     return array(
      "success"=>'true', 
      "user" => $user 
     ); 
    } // get_user [GET] /users/{id} 
} 

Пожалуйста, обратите внимание, что использование ClassResourceInterface означает, что ваши имена методов будут использоваться для создания маршрутов. см. FOSRestBundle Docs для получения дополнительной информации.

Вы можете сделать что-то похожее на это для всего своего CRUD, таким образом, вы сохраняете свои маршруты раздельными и обслуживаемыми, но все равно имеете одну базовую базу кода для обновления.

+0

Не могли бы вы указать, как я могу указать путь доступа к контроллерам CRUD и REST, скажем, из браузера? Я просто хочу, чтобы один базовый пример работал, а затем я могу учиться на нем. Благодаря! –

+0

Если вы следуете методу, который я использовал с FOSRestBundle, путь к использованию для проверки будет '/ users/{id}'. Обычные контроллеры CRUD следуют тем же соглашениям, что и любое приложение symfony2. Создайте представление, создайте контроллер для визуализации представления и создайте маршрут, который вызовет контроллер. – Sehael

+0

Действительно ли мне нужны два набора маршрутов, когда те, сгенерированные symfony2, уже работают, зачем нужны оба? Что будет делать FOSRestBundle по-другому? Я спрашиваю об этом, потому что теперь у меня два экземпляра, и это немного запутывает, почему я не могу использовать CRUD, созданный только Symfony2? –

 Смежные вопросы

  • Нет связанных вопросов^_^