无法确定 "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快速生成这个;)