Symfony3.3中如何为ORMBehaviors生成的slug字段添加@Groups注解
解决方案:显式声明slug属性并添加@Groups注解
ORMBehaviors的Sluggable组件虽然能自动生成和管理slug字段,但要给它附加@Groups注解,你必须显式在实体类中声明$slug属性——因为注解只能附加在显式定义的属性上。具体操作步骤如下:
1. 添加slug属性及注解
在你的实体类中,插入以下属性代码(可以放在$description属性下方):
/** * @var string * * @ORM\Column(type="string", length=255, unique=true) * @Groups({"advertisingSpace"}) */ private $slug;
@ORM\Column用于告诉Doctrine这个字段的数据库属性(unique=true是slug的常规配置,避免重复值);@Groups({"advertisingSpace"})将slug纳入你需要的序列化分组,这样在其他关联实体的序列化输出中就能包含该字段。
2. 添加slug的getter和setter方法
为了让序列化组件能读取到slug值,同时兼容Sluggable的自动更新逻辑,添加对应的方法:
/** * @return string */ public function getSlug() { return $this->slug; } /** * @param string $slug * * @return AdvertisingSpaceCategory */ public function setSlug($slug) { $this->slug = $slug; return $this; }
3. 修正Sluggable的源字段配置(关键)
注意到你当前的getSluggableFields()方法返回的是['slug'],这会导致循环生成问题(用slug字段本身来生成slug)。你需要改成用来生成slug的源业务字段,比如基于code和description:
/** * @return array */ public function getSluggableFields() { return ['code', 'description']; }
这样Sluggable会自动根据这两个字段的内容生成唯一的slug值。
4. 同步数据库结构
添加新字段后,运行Doctrine命令更新数据库表结构:
php bin/console doctrine:schema:update --force
完成以上步骤后,slug字段既会被包含在advertisingSpace分组的序列化输出中,又能继续由Sluggable组件自动管理生成和更新逻辑。
内容的提问来源于stack exchange,提问作者Nobady
相关产品推荐
相关产品推荐

