Sylius CE自定义模型时Doctrine未检测到映射变更求助
Sylius 2.0自定义模型后Doctrine无法检测到映射变更的问题
我在自定义Sylius产品变体时遇到错误,于是重新安装了Sylius CE(严格遵循官方文档步骤),接着按照模型自定义指南操作,但执行迁移命令时始终得到错误:No changes detected in your mapping information。我已经确认_sylius.yaml中的实体路径配置正确,甚至尝试修改继承Core类的Product实体(添加capacity属性),但Doctrine依然检测不到任何变更。
怀疑是Sylius 2.0的特性、遗漏了关键步骤,或是文档过时,目前毫无头绪,若无法解决将在GitHub提交Issue。
已做的修改内容
自定义Country实体类
<?php declare(strict_types=1); namespace App\Entity\Addressing; use Doctrine\ORM\Mapping as ORM; use Sylius\Component\Addressing\Model\Country as BaseCountry; use Sylius\Component\Addressing\Model\CountryInterface; #[ORM\Entity] #[ORM\Table(name: 'sylius_country')] class Country extends BaseCountry implements CountryInterface { /** @ORM\Column(type="string", nullable=true) */ private $flag; public function getFlag(): ?string { return $this->flag; } public function setFlag(string $flag): void { $this->flag = $flag; } }
_sylius.yaml对应配置
sylius_addressing: resources: address: classes: model: App\Entity\Addressing\Address country: classes: model: App\Entity\Addressing\Country province: classes: model: App\Entity\Addressing\Province zone: classes: model: App\Entity\Addressing\Zone zone_member: classes: model: App\Entity\Addressing\ZoneMember
尝试修改的Product实体类
<?php declare(strict_types=1); namespace App\Entity\Product; use Doctrine\ORM\Mapping as ORM; use Sylius\Component\Core\Model\Product as BaseProduct; use Sylius\Component\Product\Model\ProductTranslationInterface; #[ORM\Entity] #[ORM\Table(name: 'sylius_product')] class Product extends BaseProduct { /** @ORM\Column(type="integer", nullable=true) */ private $capacity; public function getCapacity(): ?int { return $this->capacity; } public function setCapacity(int $capacity): void { $this->capacity = $capacity; } protected function createTranslation(): ProductTranslationInterface { return new ProductTranslation(); } }
可能的解决方案
1. 确认Doctrine是否识别自定义实体
执行命令查看Doctrine映射的实体列表,检查自定义实体是否在列:
php bin/console doctrine:mapping:list
如果未找到,检查config/packages/doctrine.yaml的mappings配置,确保App命名空间被正确扫描:
doctrine: orm: mappings: App: is_bundle: false type: attribute dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App
2. 清除所有相关缓存
缓存可能导致映射变更不被检测,执行以下命令清理:
php bin/console cache:clear php bin/console doctrine:cache:clear-metadata php bin/console doctrine:cache:clear-query php bin/console doctrine:cache:clear-result
3. 检查实体注解正确性
- 确认实体类上的
#[ORM\Entity]、#[ORM\Table]注解参数正确,表名与Sylius原有表名一致 - 新增属性的
#[ORM\Column]注解类型、可空性等参数无错误
4. 完善Sylius资源配置
部分场景下需要显式配置repository、factory等资源类,确保Sylius完全识别自定义模型:
sylius_addressing: resources: country: classes: model: App\Entity\Addressing\Country repository: Sylius\Component\Addressing\Repository\CountryRepository factory: Sylius\Component\Resource\Factory\Factory
5. 手动指定实体生成迁移
如果自动检测无效,尝试针对自定义实体生成迁移:
# 针对单个实体 php bin/console doctrine:migrations:diff --filter-expression="App\\Entity\\Addressing\\Country" # 针对所有App实体 php bin/console doctrine:migrations:diff --filter-expression="App\\Entity"
6. 匹配Sylius 2.0的Doctrine要求
Sylius 2.0依赖Doctrine ORM 2.14+,确保项目已开启属性注解类型的映射(你的代码已使用属性注解,需确认doctrine.yaml中type: attribute配置正确)。
内容的提问来源于stack exchange,提问作者Bryan Sacrelab
相关产品推荐
相关产品推荐

