Symfony 3.4:为EntityType选择框添加非实体属性
在Symfony 3.4中为EntityType选择框添加非实体属性
嘿,要给你的game选择框加上不属于Game实体的属性,最直接的方案就是利用EntityType自带的choice_attr选项——它专门用来给每个<option>标签自定义HTML属性,不管属性值是不是实体自带的字段都能搞定。下面给你两种实用的实现方式:
方法一:动态生成属性(适合需要从外部获取数据的场景)
如果你的额外属性需要根据每个Game实例动态获取(比如从其他服务、关联表或者计算得到),可以用回调函数来实现。比如假设你想给每个选项加data-developer和data-rating两个属性,其中data-rating是Game实体没有的字段,需要从外部服务获取:
->add('game', EntityType::class, [ 'class' => Game::class, 'multiple' => false, 'expanded' => false, 'choice_attr' => function (Game $game, $key, $index) { // 这里可以调用服务、查询数据库或者做计算来获取非实体属性值 $gameRating = $this->gameRatingService->getRating($game->getId()); return [ 'data-developer' => $game->getDeveloper(), // 实体已有字段 'data-rating' => $gameRating, // 非实体属性 ]; }, ])
生成后的HTML选项会是这样:
<option value="1" data-developer="Rockstar" data-rating="9.5">Grand Theft Auto V</option>
方法二:固定属性(适合所有选项属性相同的场景)
如果你的额外属性是固定值(比如给所有选项加同一个标识属性),直接传数组就行:
->add('game', EntityType::class, [ 'class' => Game::class, 'multiple' => false, 'expanded' => false, 'choice_attr' => [ 'data-category' => 'video-game', 'data-track' => 'true', ], ])
小提示
- 如果在回调里需要用到服务(比如上面的
gameRatingService),记得在表单类的构造函数里注入对应的服务,Symfony 3.4支持构造函数注入哦。 - 如果属性值需要批量查询,建议提前在表单类里一次性查完所有需要的数据,避免在回调里每次查询导致性能下降。
内容的提问来源于stack exchange,提问作者Laiboa
相关产品推荐
相关产品推荐

