Symfony2 хранение запросов в объекте

#php #symfony

#php #symfony

Вопрос:

Я создаю API с помощью пакета fosRest.

Метод, в котором я застрял, выглядит так:

 public function postUser(Request $request)
{
}
 

Я хочу обработать запрос с User помощью объекта вместо Request , но проблема в том, что я получаю параметры, которых нет в User классе, или имеют разные имена

Каков наилучший способ обработки этого запроса с помощью пользовательского объекта и где его хранить?

Я хочу сделать это, чтобы в IDE был автоматический ввод кода.

Моя идея — создать User класс модели, достаточно ли для этого?

Ответ №1:

Попробуйте использовать @ParamConverter аннотацию from SensioFrameworkExtraBundle для ввода $user параметра в ваш контроллер на основе данных запроса.

 <?php

namespace AppBundleController;

use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
use AppbundleEntityUser;

class UserController
{
    /** 
     * @ParamConverter("user", class="AppBundle:User") 
     */
    public function postUserAction(User $user)
    {
        // ...
    }
}
 

(Вот документы symfony для SensionFrameworkExtraBundle и, в частности, @ParamConverter аннотации.)

Используя use ваш User класс и вводя его в параметр контроллера, ваша среда разработки должна иметь возможность получить больше информации об этом. Конечно, для разных IDE необходимы разные подходы, но это дает вам сильную стартовую позицию.

Как и в документах, вы можете предоставить более подробную информацию о том, как именно фреймворк должен пытаться преобразовать параметр в объект:

Параметры DoctrineConverter

Для управления поведением в аннотации @ParamConverter или (@Entity) доступно несколько опций: id: если параметр id настроен и соответствует параметру маршрута, тогда конвертер найдет по первичному ключу. Один простой id пример, приведенный ниже:

 /**
 * @Route("/blog/{post_id}")
 * @ParamConverter("post", options={"id" = "post_id"})
  */
public function showPostAction(Post $post)
{
}
 

Комментарии:

1. согласен, это хорошо, но у меня больше параметров, чем содержит класс User, может быть, в inject User и оставил запрос, чтобы все оставшиеся параметры были там? public function showPostAction(Post $post, Request $request) { }

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