#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
из них является самим собой, когда он так типизирован.