api-platform.com Невозможно сгенерировать IRI для элемента типа

Я пытаюсь настроить свой первый экземпляр api-платформы и столкнулся с некоторыми предположительными вопросами по поводу IDE. То, что я пытаюсь сделать, — это настроить объект регистрации и сброса, чтобы иметь дело с регистрациями и напоминаниями пароля из приложения. А затем передайте сущность пользовательскому контроллеру для выполнения некоторых проверок, балансировок и почтовых операций впоследствии (пока не дошли до этого). Но я продолжаю сталкиваться с этой ошибкой при публикации своих пользовательских объектов:

{
"@context": "/api/contexts/Error",
"@type": "hydra:Error",
"hydra:title": "An error occurred",
"hydra:description": "Unable to generate an IRI for the item of type \"App\\XXX\\UserBundle\\Entity\\Register\"",
"trace": [
{
"namespace": "",
"short_class": "",
"class": "",
"type": "",
"function": "",
"file": "/var/www/webservice/vendor/api-platform/core/src/Bridge/Symfony/Routing/IriConverter.php",
"line": 116,
"args": []
},
{
"namespace": "ApiPlatform\\Core\\Bridge\\Symfony\\Routing",
"short_class": "IriConverter",
"class": "ApiPlatform\\Core\\Bridge\\Symfony\\Routing\\IriConverter",
"type": "->",
"function": "getIriFromItem",
"file": "/var/www/webservice/vendor/api-platform/core/src/JsonLd/Serializer/ItemNormalizer.php",
"line": 71,
"args": [
[
"object",
"App\\XXX\\UserBundle\\Entity\\Register"]
]
},
{
"namespace": "ApiPlatform\\Core\\JsonLd\\Serializer",
"short_class": "ItemNormalizer",
"class": "ApiPlatform\\Core\\JsonLd\\Serializer\\ItemNormalizer",
"type": "->",
"function": "normalize",
"file": "/var/www/webservice/vendor/symfony/serializer/Serializer.php",
"line": 138,
"args": [
[
"object",
"App\\XXX\\UserBundle\\Entity\\Register"],
[
"string",
"jsonld"],
[
"array",
{
"collection_operation_name": [
"string",
"post"],
"operation_type": [
"string",
"collection"],
"resource_class": [
"string",
"App\\XXX\\UserBundle\\Entity\\Register"],
"request_uri": [
"string",
"/api/register"],
"uri": [
"string",
"http://webservice.local/api/register"],
"resources": [
"object",
"ApiPlatform\\Core\\Serializer\\ResourceList"],
"jsonld_has_context": [
"boolean",
true
]
}
]
]
},
{
"namespace": "Symfony\\Component\\Serializer",
"short_class": "Serializer",
"class": "Symfony\\Component\\Serializer\\Serializer",
"type": "->",
"function": "normalize",
"file": "/var/www/webservice/vendor/symfony/serializer/Serializer.php",
"line": 111,
"args": [
[
"object",
"App\\XXX\\UserBundle\\Entity\\Register"],
[
"string",
"jsonld"],
[
"array",
{
"collection_operation_name": [
"string",
"post"],
"operation_type": [
"string",
"collection"],
"resource_class": [
"string",
"App\\XXX\\UserBundle\\Entity\\Register"],
"request_uri": [
"string",
"/api/register"],
"uri": [
"string",
"http://webservice.local/api/register"],
"resources": [
"object",
"ApiPlatform\\Core\\Serializer\\ResourceList"]
}
]
]
},
{
"namespace": "Symfony\\Component\\Serializer",
"short_class": "Serializer",
"class": "Symfony\\Component\\Serializer\\Serializer",
"type": "->",
"function": "serialize",
"file": "/var/www/webservice/vendor/api-platform/core/src/EventListener/SerializeListener.php",
"line": 67,
"args": [
[
"object",
"App\\XXX\\UserBundle\\Entity\\Register"],
[
"string",
"jsonld"],
[
"array",
{
"collection_operation_name": [
"string",
"post"],
"operation_type": [
"string",
"collection"],
"resource_class": [
"string",
"App\\XXX\\UserBundle\\Entity\\Register"],
"request_uri": [
"string",
"/api/register"],
"uri": [
"string",
"http://webservice.local/api/register"],
"resources": [
"object",
"ApiPlatform\\Core\\Serializer\\ResourceList"]
}
]
]
},
{
"namespace": "ApiPlatform\\Core\\EventListener",
"short_class": "SerializeListener",
"class": "ApiPlatform\\Core\\EventListener\\SerializeListener",
"type": "->",
"function": "onKernelView",
"file": "/var/www/webservice/vendor/symfony/event-dispatcher/EventDispatcher.php",
"line": 212,
"args": [
[
"object",
"Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent"],
[
"string",
"kernel.view"],
[
"object",
"Symfony\\Component\\EventDispatcher\\EventDispatcher"]
]
},
{
"namespace": "Symfony\\Component\\EventDispatcher",
"short_class": "EventDispatcher",
"class": "Symfony\\Component\\EventDispatcher\\EventDispatcher",
"type": "->",
"function": "doDispatch",
"file": "/var/www/webservice/vendor/symfony/event-dispatcher/EventDispatcher.php",
"line": 44,
"args": [
[
"array",
[
[
"array",
[
[
"object",
"ApiPlatform\\Core\\Validator\\EventListener\\ValidateListener"],
[
"string",
"onKernelView"]
]
],
[
"array",
[
[
"object",
"ApiPlatform\\Core\\EventListener\\WriteListener"],
[
"string",
"onKernelView"]
]
],
[
"array",
[
[
"object",
"ApiPlatform\\Core\\EventListener\\SerializeListener"],
[
"string",
"onKernelView"]
]
],
[
"array",
[
[
"object",
"ApiPlatform\\Core\\EventListener\\RespondListener"],
[
"string",
"onKernelView"]
]
]
]
],
[
"string",
"kernel.view"],
[
"object",
"Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent"]
]
},
{
"namespace": "Symfony\\Component\\EventDispatcher",
"short_class": "EventDispatcher",
"class": "Symfony\\Component\\EventDispatcher\\EventDispatcher",
"type": "->",
"function": "dispatch",
"file": "/var/www/webservice/vendor/symfony/http-kernel/HttpKernel.php",
"line": 154,
"args": [
[
"string",
"kernel.view"],
[
"object",
"Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent"]
]
},
{
"namespace": "Symfony\\Component\\HttpKernel",
"short_class": "HttpKernel",
"class": "Symfony\\Component\\HttpKernel\\HttpKernel",
"type": "->",
"function": "handleRaw",
"file": "/var/www/webservice/vendor/symfony/http-kernel/HttpKernel.php",
"line": 66,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"],
[
"integer",
1
]
]
},
{
"namespace": "Symfony\\Component\\HttpKernel",
"short_class": "HttpKernel",
"class": "Symfony\\Component\\HttpKernel\\HttpKernel",
"type": "->",
"function": "handle",
"file": "/var/www/webservice/vendor/symfony/http-kernel/Kernel.php",
"line": 188,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"],
[
"integer",
1
],
[
"boolean",
true
]
]
},
{
"namespace": "Symfony\\Component\\HttpKernel",
"short_class": "Kernel",
"class": "Symfony\\Component\\HttpKernel\\Kernel",
"type": "->",
"function": "handle",
"file": "/var/www/webservice/public/index.php",
"line": 37,
"args": [
[
"object",
"Symfony\\Component\\HttpFoundation\\Request"]
]
}
]
}

Я, конечно, провел некоторые исследования самостоятельно и посмотрел на оба:

Поэтому я добавил идентификатор (который не нужен, поскольку этот объект используется только для записей), очистил наличные деньги, проверил методы получения и установки, но все безрезультатно.

Сущность в настоящее время выглядит так

/**
* The register Entity
*
* @ApiResource(
*      collectionOperations={
*          "post"={"method"="POST", "path"="/register", "controller" = RegisterController::class}
*      }
* )
*/

class Register implements \Serializable
{
/**
* The unique identifier of this user <br /><b>Schema:</b> <a href="http://schema.org/identifier">https://schema.org/identifier</a>
*
* @var integer
*
* @ApiProperty(iri="https://schema.org/identifier", identifier=true)
*/
protected $id;

/**
* The unique username of this user, used as a security credential alongside the password
*
* @var string
*
*/
protected $username;

/**
* The non-unique e-mail address, used to contact the user on security issues
*
* @var string
*
* @ApiProperty(iri="http://schema.org/email")
*/
protected $email;

/**
* The non-unique password of this user, used as a security credential alongside the e-mail. Passwords are hashed in the database and can therefore never be rendered or viewed
*
* @var string
*
*/
protected $password;

/**
* Serializing the user data that is set into the session
*/
/** @see \Serializable::serialize() */
public function serialize()
{
return serialize(array(
$this->id,
$this->username,
$this->password,
$this->email
));
}

/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
list (
$this->id,
$this->username,
$this->password,
$this->email,
) = unserialize($serialized);
}


/**
* Get id.
*
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* Get id.
*
* @return User
*/
public function setId($id)
{
$this->id= $id;

return $this;
}

/**
* Set username
*
* @param string $username
*
* @return User
*/
public function setUsername($username)
{
$this->username = $username;

return $this;
}

public function getUsername()
{
return $this->username;
}

/**
* Set password
*
* @param string $password
*
* @return User
*/
public function setPassword($password)
{
$this->password = $password;

return $this;
}

public function getPassword()
{
return $this->password;
}


/**
* Set email.
*
* @param string $email
*
* @return User
*/
public function setEmail($email)
{
$this->email = $email;

return $this;
}

/**
* Get email.
*
* @return string
*/
public function getEmail()
{
return $this->email;
}
}

Контроллер (не совсем законченный, но сначала пытающийся решить это):

/**
* Register controller
*
* @category   Controller
* @package    XXX\UserBundle
* @subpackage Controller
*
*/

namespace App\XXX\UserBundle\Controller;


use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\XXX\UserBundle\Service\UserService;
use App\XXX\UserBundle\Entity\User;
use App\XXX\UserBundle\Entity\Register;

class RegisterController extends Controller
{
private $userService;

public function __construct(UserService $userService)
{
$this->userService= $userService;
}

public function __invoke(Register $data): Register
{
//$this->myService->doSomething($data);

/*
$user = $this->userService->register($data);

if($user){
//  $token = JWTManager::create($user)

// voorbeeld

// return serialized token
// @var JWTManager $jwtManager
$jwtManager = $this->get('lexik_jwt_authentication.jwt_manager');
$jwt = $jwtManager->create($user);
$response = new JsonResponse();
$response->setData(array('token' => $jwt));
return $response;
}
*/
return $data;
}


}

и последнее, но не менее важное: config / route / api_platform.yaml

api_platform:
resource: .
type: api_platform
prefix: /api


user_register:
path: '/api/register'
methods:  ['POST']
defaults:
_controller: '\App\XXX\UserBundle\RegisterController::class'
_api_resource_class: 'App\XXX\UserBundle\Entity\Register'
_api_item_operation_name: 'register'

user_reminder:
path: '/api/reset'
methods:  ['POST']
defaults:
_controller: '\App\XXX\UserBundle\ResetController::class'
_api_resource_class: 'App\XXX\UserBundle\Entity\Reset'
_api_item_operation_name: 'rest'

user_login:
path: '/api/login'
methods:  ['POST']
defaults:
_controller: '\App\XXX\UserBundle\LoginController::class'
_api_resource_class: 'App\XXX\UserBundle\Entity\Login'
_api_item_operation_name: 'login'

Я, наверное, упускаю из виду кое-что простое здесь, но я потратил на это часы и просто не могу заставить его работать.

— Обновить —
Я изменил все обратно на основной (для тестирования и поиска ошибок), и он просто не будет летать. Добавил get / set и даже сделал ID общедоступным, он просто не будет работать. Даже этот простой класс ниже дает мне ошибку IRI. Так что, в основном, все, что я пытаюсь сделать, не является объектом ORM, не работает

use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;

/**
* The user Entity
*
* @ApiResource(
*      itemOperations={
*          "get"={"method"="GET"},
*      },
*      collectionOperations={
*          "get"={"method"="GET"},
*          "register"={"route_name"="register_register"},
*      },
* )
*/

class Register
{
/**
* The unique identifier of this user <br /><b>Schema:</b> <a href="http://schema.org/identifier">https://schema.org/identifier</a>
*
* @var integer
*
* @ApiProperty(identifier=true)
*/
public  $id;


/**
* Get id.
*
* @return int
*/
public function setId($id)
{
$this->id = $id;

return $this;
}


/**
* Get id.
*
* @return int
*/
public function getId()
{
return $this->id;
}
}

0

Решение

Вы смотрели на эту тему? Платформа API — невозможно создать IRI для элемента

Обычно эта ошибка возникает, когда свойство Id недоступно

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector