api plateform, исправить преобразователь iri

Я ищу подход, чтобы узнать, получить ресурс, не зависящий от его идентификатора, а что-то вроде username, GET /api/user/{username}.

Я сделал что-то вроде этого:

/**
* @ApiRessource({
*     itemOperations={
*         "get"={
*             "normalization_context"={"groups"={"user:read"}},
*             "path"="/user/{username}", "read"=false,
*             "controller"=ApiUser::class,
*             "openapi_context"={
*                  "summary" = "Récupérer un freehelper en particulier par son nom"
*              },
*          },
})
*/
class User{
{
    /**
     * @Groups({"user:read"})
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @ApiProperty(identifier=false)
     */
    private $id;

    /**
     * @Groups({"user:read"})
     * @ORM\Column(type="string", length=56, unique=true)
     * @ApiProperty(identifier=true)
     */
    private $username;
....
}

а затем я пишу и dataproider, как описано здесь, поэтому я получил эту ошибку

"detail": "Unable to generate an IRI for \"App\\Entity\\User\".",

Вы можете помочь мне понять, как это сделать?


person tiana    schedule 02.08.2020    source источник
comment
Есть ли у вас RuntimeException в журналах? Изменится ли это, если добавить @var string в phpdoc?   -  person shvv    schedule 04.08.2020
comment
@shvv Я немного изменил ресурс, добавив ResourceController, и в журнале говорится, что отсутствуют некоторые обязательные параметры (\ username \) для создания URL-адреса для маршрута \ get_user \   -  person tiana    schedule 05.08.2020


Ответы (1)


Вы можете создать такую ​​функцию в контроллере ApiUser:

/**
 * @Route("/user/{username}", name="api_user_username", methods={"GET"})
 */
public function getByUsername($username)
{
    $event = $this->em->getRepository(User::class)
                ->findOneBy(["username" => $username));

    return $this->httpKernel
                ->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
}
 
person Khaled Alam    schedule 02.08.2020
comment
спасибо за быстрый ответ @Khaled, я не понимаю, как и когда будет вызван этот метод getByUsername, тогда, как описано в документации, должно произойти __invoke, и я реализовал это с описанием маршрута, объяснил бы это подробнее, спасибо. - person tiana; 03.08.2020
comment
Контроллеры Symfony не рекомендуются. Кроме того, обратите внимание, что контроллер вызывается ТОЛЬКО по объявленному запросу, а не при получении, например, отношения сущностей. - person rugolinifr; 03.08.2020
comment
@rugolinifr, да, вы правы, по вашему мнению, как получить элемент по другому свойству, а не по идентификатору? как / user / {property_different_id}? спасибо, я немного запутался. - person tiana; 05.08.2020
comment
Я думаю, что единственная ошибка, которую вы сделали до сих пор, - это объявить новый путь к операции get элемента. Вам следует удалить его и оставить в представлении openApi отображение / api / users / {id}. Слово {id} не означает частный $ id; но идентификатор. Поскольку вы следили за страницей документации, чтобы изменить свой идентификатор, это нормально. Согласны ли мы, что ваша реализация ItemDataProviderInterface :: getItem () похожа на return $this->userRepository->findOneBy(['username' => $id]);? Если да, то ваши пользовательские объекты должны быть сериализованы / десериализованы с помощью таких URL-адресов, как / api / users / foo. - person rugolinifr; 06.08.2020