重写Symfony Getter和Setter生成器以生成帕斯卡命名风格方法的实现咨询
嗨,我之前也碰到过这种严格遵循帕斯卡命名规范的项目需求,刚好可以给你梳理下怎么修改Symfony的make:entity生成逻辑,不用再手动改getter/setter的命名了。
首先明确一点:Symfony的MakerBundle本身没有提供直接配置命名风格的选项,所以我们需要通过重写核心生成类来实现这个需求,具体步骤如下:
1. 定位核心生成逻辑
负责make:entity生成getter/setter的是MakerBundle里的Symfony\Bundle\MakerBundle\Generator\EntityGenerator类,其中的getGetterMethodName和getSetterMethodName两个方法决定了最终生成的方法名格式,默认是小驼峰(比如getId()、setId())。
2. 创建自定义生成器类
我们需要继承原有的EntityGenerator,重写那两个方法,把命名规则改成帕斯卡风格:
// src/Generator/CustomEntityGenerator.php namespace App\Generator; use Symfony\Bundle\MakerBundle\Generator\EntityGenerator; use Symfony\Bundle\MakerBundle\Str; class CustomEntityGenerator extends EntityGenerator { /** * 重写getter方法名生成逻辑 */ protected function getGetterMethodName(string $propertyName): string { // 先把属性名转成标准小驼峰,再拼接首字母大写的Get前缀 return 'Get' . ucfirst(Str::asCamelCase($propertyName)); } /** * 重写setter方法名生成逻辑 */ protected function getSetterMethodName(string $propertyName): string { // 同理,拼接首字母大写的Set前缀 return 'Set' . ucfirst(Str::asCamelCase($propertyName)); } }
3. 替换原有服务
在Symfony的服务配置文件(config/services.yaml)中,把默认的maker.entity_generator服务替换成我们自定义的类,注意要保持和原服务一致的依赖注入:
# config/services.yaml services: Symfony\Bundle\MakerBundle\Generator\EntityGenerator: class: App\Generator\CustomEntityGenerator arguments: - '@maker.doctrine_helper' - '@maker.generator' - '@maker.file_manager' - '@maker.str'
你可以通过运行bin/console debug:container maker.entity_generator来确认原服务的依赖参数,确保注入的服务ID完全一致。
4. 验证效果
现在运行bin/console make:entity创建新实体或者给现有实体添加属性,生成的getter和setter就会自动变成帕斯卡命名风格,比如public function GetId()、public function SetId(),完全符合项目的规范要求。
另外补充个小提示:如果你的项目属性名是下划线分隔(比如user_name),Str::asCamelCase()会自动把它转成userName,再加上前缀就变成GetUserName,完美适配各种属性命名习惯。
备注:内容来源于stack exchange,提问作者CR7

