В чем разница между сгенерированным контроллером Symfony2 и контроллером FOSRestBundle?

Я запутался в этом вопросе, и я был бы признателен, если бы кто-нибудь мог дать мне объяснение с конкретными примерами. Я сгенерировал CRUD-контроллер с помощью Symfony, а также реализовал FOSRestBundle Controller для REST. Они оба возвращают одни и те же данные, и мне интересно, в чем разница и что может сделать один, чего не может другой? На данный момент я хотел бы придерживаться только одного в прототипе, который я создаю, и расширять его, как только я лучше пойму, как Symfony2 работает. Вот код CRUD от Symfony2:

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

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

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

Изменив имя этого метода, я получаю FOSRestController (с правильной настройкой)

// "get_users"     [GET] /users

public function getUsersAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('SomethingWebServicesBundle:Users')->findAll();

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

person Paul A.    schedule 07.12.2013    source источник


Ответы (1)


Они оба являются контроллерами, и вы должны использовать только один для одних и тех же задач.

Контроллер Symfony по умолчанию — это просто класс с удобными методами для быстрого доступа к наиболее часто используемым вещам (например, создание формы, перенаправление и т. д.). Вам не нужно расширять этот контроллер, он просто дает вам некоторые «дополнения».

FOSRestController расширяет контроллер Symfony и добавляет несколько удобных методов при использовании FOSRestBundle. Опять же, вам не нужно его использовать, он просто упрощает код для вас.

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

Чтобы получить ответы о том, что может FOSRestBundle, вы должны прочитать их документы.

person Wouter J    schedule 07.12.2013
comment
Wouter J, теперь у меня их два, но на самом деле я бы предпочел иметь CRUD-контроллеры Symfony2, поскольку я могу создавать их быстрее и одновременно стандартизировать свой код (прототип). Прямо сейчас я думаю, что мне нужно, чтобы они могли постоянно возвращать JSON. Как я могу заставить их просто возвращать данные JSON? Если они это сделают, это самое близкое, что я могу сделать их RESTful? - person Paul A.; 07.12.2013
comment
Как уже говорилось, единственное, что делает FOSRestController, — это предоставляет вам методы для ярлыков. Просто посмотрите, что на самом деле делают эти методы (они вызывают только фасадный iirc) и используйте это в своем CRUD-контроллере Symfony. - person Wouter J; 07.12.2013