Невозможно определить идентификатор объекта для объекта типа «Пространство имен класс»; нет полей, соответствующих «id»

#orm #doctrine-orm #laminas-api-tools

#orm #doctrine-orm #laminas-api-tools

Вопрос:

Я пытаюсь использовать ORM в моем laminas api tools . Все работает, однако, похоже api-tools-hal , что не может распознать поля.

Это часть моего module.config.php

 'router' => [
    'routes' => [
        'customer.rest.customer' => [
            'type' => 'Segment',
            'options' => [
                'route' => '/customer[/:customer_id]',
                'defaults' => [
                    'controller' => 'Customer\V1\Rest\Customer\Controller',
                ],
            ],
        ],
],
'api-tools-hal' => [
    'metadata_map' => [
        CustomerV1RestCustomerCustomerEntity::class => [
            'entity_identifier_name' => 'id',
            'route_name' => 'customer.rest.customer',
            'route_identifier_name' => 'customer_id',
            'hydrator' => LaminasHydratorObjectPropertyHydrator::class,
        ],
   ],
]
  

Мой CustomerV1RestCustomerCustomerEntity::class

 use DoctrineORMMapping as ORM;
/**
 * CustomerEntity
 * @ORMEntity
 * @ORMTable(uniqueConstraints={
 *   @ORMUniqueConstraint(name="email", columns={"email"}),
 * })
 * @ORMEntity(repositoryClass="CustomerV1RestCustomerCustomerRepository")
 * @ORMTable(name = "customers")
 */
class CustomerEntity
{
    /**
     * The unique auto incremented primary key.
     *
     * @var int|null
     *
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    protected $id;
  

Команда ORM cli orm:schema-tool:create работает.

Но при переходе к domain.com/customer нему выдает эту ошибку:

Невозможно определить идентификатор объекта для объекта типа «Customer V1 Rest CustomerType CustomerEntity»; нет полей, соответствующих «id»

Когда я удаляю аннотацию ORM в объекте, это работает.

Что мне нужно сделать в этом случае?

Ответ №1:

На самом деле, нет, это не глупо ;). И, пожалуйста, не вводите свой идентификатор public , поскольку у вас нет причин для этого.

Другой способ исправить это — создать пару getter / setter. В этом случае я бы предположил, что средства получения достаточно. Поэтому просто сделайте public function getId(): ?int , чтобы исправить ошибку, нет необходимости в установщике, поскольку он нужен вам только для разрешения аргумента маршрута.

 public function getId(): ?int
{
    return $this->id;
}
  

Небольшие советы: если вы используете PhpStorm, просто нажмите Alt Inser, а затем Getter быстро сгенерируйте это 😉

Комментарии:

1. У меня есть это, и это не помогло. У меня есть ID и UUID для таблицы, и я запрашиваю UUID , поэтому в основном id всегда является закрытым и uuid общедоступным. Но я уверен, что есть лучший способ сделать это.

2. У меня уже есть общедоступные геттеры и сеттеры. Наличие public function getUid() не помогает.

3. Я действительно не знаю, что он ведет себя так, но разве не странно, что он говорит о CustomerTypeEntity том, когда вы пытаетесь исправить CustomerEntity ?

4. Извините, моя ошибка, ошибка должна быть такой: Unable to determine entity identifier for object of type "CustomerV1RestCustomerCustomerEntity"; no fields matching "id" . Оба CustomerEntity и CustomerTypeEntity почти идентичны.

Ответ №2:

Хорошо, поэтому мне нужно создать свои поля public .

protected $id; становится public $id , тогда это работает.

Это просто я глупый. Обучение идет хорошо.