#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
, тогда это работает.
Это просто я глупый. Обучение идет хорошо.