无法确定 "Namespace\Class" 类型对象的实体标识符;没有字段匹配 "id"
Unable to determine entity identifier for object of type "Namespace\Class"; no fields matching "id"
我正在尝试在我的 laminas api tools
中使用 ORM。一切正常,但是,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' => [
\Customer\V1\Rest\Customer\CustomerEntity::class => [
'entity_identifier_name' => 'id',
'route_name' => 'customer.rest.customer',
'route_identifier_name' => 'customer_id',
'hydrator' => \Laminas\Hydrator\ObjectPropertyHydrator::class,
],
],
]
我的Customer\V1\Rest\Customer\CustomerEntity::class
use Doctrine\ORM\Mapping as ORM;
/**
* CustomerEntity
* @ORM\Entity
* @ORM\Table(uniqueConstraints={
* @ORM\UniqueConstraint(name="email", columns={"email"}),
* })
* @ORM\Entity(repositoryClass="Customer\V1\Rest\Customer\CustomerRepository")
* @ORM\Table(name = "customers")
*/
class CustomerEntity
{
/**
* The unique auto incremented primary key.
*
* @var int|null
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
ORM cli 命令 orm:schema-tool:create
有效。
但是在转到 domain.com/customer
时会抛出此错误:
Unable to determine entity identifier for object of type
"Customer\V1\Rest\CustomerType\CustomerEntity"; no fields
matching "id"
当我删除实体中的 ORM 注释时,它就起作用了。
遇到这种情况我需要做什么?
好的,所以我需要创建我的字段 public
。
protected $id;
变成 public $id
然后就可以了。
这只是我愚蠢。学习不错。
实际上,不,那并不愚蠢 ;)。并且请不要制作您的 ID public
,因为您没有理由这样做。
解决此问题的另一种方法是创建一对 getter/setter。在这种情况下,我猜 getter 就足够了。所以只需制作一个 public function getId(): ?int
来修复错误,不需要 setter 因为你只需要它来解析路由的参数。
public function getId(): ?int
{
return $this->id;
}
小提示:如果你使用PHPStorm,只需按Alt + Inser然后Getter
快速生成这个;)
我正在尝试在我的 laminas api tools
中使用 ORM。一切正常,但是,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' => [
\Customer\V1\Rest\Customer\CustomerEntity::class => [
'entity_identifier_name' => 'id',
'route_name' => 'customer.rest.customer',
'route_identifier_name' => 'customer_id',
'hydrator' => \Laminas\Hydrator\ObjectPropertyHydrator::class,
],
],
]
我的Customer\V1\Rest\Customer\CustomerEntity::class
use Doctrine\ORM\Mapping as ORM;
/**
* CustomerEntity
* @ORM\Entity
* @ORM\Table(uniqueConstraints={
* @ORM\UniqueConstraint(name="email", columns={"email"}),
* })
* @ORM\Entity(repositoryClass="Customer\V1\Rest\Customer\CustomerRepository")
* @ORM\Table(name = "customers")
*/
class CustomerEntity
{
/**
* The unique auto incremented primary key.
*
* @var int|null
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
ORM cli 命令 orm:schema-tool:create
有效。
但是在转到 domain.com/customer
时会抛出此错误:
Unable to determine entity identifier for object of type "Customer\V1\Rest\CustomerType\CustomerEntity"; no fields matching "id"
当我删除实体中的 ORM 注释时,它就起作用了。
遇到这种情况我需要做什么?
好的,所以我需要创建我的字段 public
。
protected $id;
变成 public $id
然后就可以了。
这只是我愚蠢。学习不错。
实际上,不,那并不愚蠢 ;)。并且请不要制作您的 ID public
,因为您没有理由这样做。
解决此问题的另一种方法是创建一对 getter/setter。在这种情况下,我猜 getter 就足够了。所以只需制作一个 public function getId(): ?int
来修复错误,不需要 setter 因为你只需要它来解析路由的参数。
public function getId(): ?int
{
return $this->id;
}
小提示:如果你使用PHPStorm,只需按Alt + Inser然后Getter
快速生成这个;)