Указано неверное значение (неверный IRI?) Ошибка тестирования конечной точки api-платформы - PullRequest
6 голосов
/ 11 апреля 2019

У меня есть сущность Product, связанная с другой сущностью User с отношением manyToOne

class Product implements AuthoredEntityInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="products")
* @ORM\JoinColumn(nullable=false)
*/
private $user;

/**
* @ORM\Column(type="string", length=255)
*/
private $name;

/**
* @ORM\Column(type="double")
*/
private $price;

//various getters and setters

}

AuthoredEntityInterface помогает установить текущего пользователя, вошедшего в систему.когда я делаю вызов API в / api / products (я использую почтальона), передавая json, как это:

{
    "name": "my product",
    "price": 10
}

Это работает, и создается новая запись.Проблема в модульных тестах.Я звоню так:

$headers = [
        'HTTP_AUTHORIZATION' => 'Bearer ' . $token,
        'CONTENT_TYPE' => 'application/ld+json',
        'HTTP_ACCEPT' => 'application/ld+json'
    ];
$postData = [
    'name' => 'my product',
    'price' => 10
];
$client = $this->makeClient();
    $client->request('POST', '/api/products', [], [], $headers, json_encode($postData));

Я получаю эту ошибку: Предоставлено неверное значение (недопустимый IRI?)

Теперь должен указываться только IRIпользователь, как уже упоминалось, автоматически генерируется внутри класса.

Есть идеи?

ОБНОВЛЕНИЕ:

Заполнение поля пользователя

Метод в продукте

public function setUser(UserInterface $user): AuthoredEntityInterface
{
    $this->user = $user;
    return $this;
}

Тогда я использую подписчика на событие:

class AuthoredEntitySubscriber implements EventSubscriberInterface
{
/** @var TokenStorageInterface */
private $tokenStorage;

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

public static function getSubscribedEvents()
{
    return [
        KernelEvents::VIEW => ['getAuthenticatedUser', EventPriorities::PRE_WRITE]
    ];
}

public function getAuthenticatedUser(GetResponseForControllerResultEvent $event)
{
    $entity = $event->getControllerResult();
    $method = $event->getRequest()->getMethod();

    /** @var UserInterface $user */
    $user = $this->tokenStorage->getToken()->getUser();

    if((!$entity instanceof AuthoredEntityInterface) || Request::METHOD_POST != $method) {
        return;
    }

    $entity->setUser($user);
}
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Я почти уверен, что вы столкнулись с той же ошибкой, которая была у меня некоторое время назад, учетные данные аутентификации не должны передаваться в заголовке запроса, они должны передаваться через клиента.

Пример:

$credentials = array(
    'HTTP_AUTHORIZATION' => 'Bearer ' . $token,
);

$client = $this->makeClient($credentials);

Также убедитесь, что HTTP_AUTHORIZATION - правильное имя, которое вам нужно использовать.Часто это просто Авторизация.

Подводя итог, можно сказать, что есть заголовки запросов и заголовки клиентов.Убедитесь, что вы устанавливаете аутентификацию в заголовках клиента.

0 голосов
/ 11 апреля 2019

Вы должны закодировать $postData в нужный тип контента, например. JSON и закодированные данные должны быть переданы в $client->request()

...