提供的值无效(IRI无效?)测试api平台端点

时间:2019-04-11 07:30:31

标签: php symfony api-platform.com

我有一个Product实体,它与另一个与ManyToOne关联的User实体相关

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 / products(我使用邮递员)进行api调用时,传递的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 :(得分:0)

您必须将$postData编码为所需的内容类型,例如。 JSON,并且必须将编码后的数据传递到$client->request()

答案 1 :(得分:0)

我很确定您遇到的错误与我之前遇到的错误相同,不应在请求头中传递身份验证凭据,而应通过客户端传递。

示例:

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

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

还要确保HTTP_AUTHORIZATION是您需要使用的正确名称。很多时候它只是授权。

回顾一下,有请求标头和客户端标头。确保您在客户端标题中设置了身份验证。