自定义服务类必须放在 src/ 目录下且路径与命名空间严格一致,如 src/service/usermailer.php 对应 app\service;依赖 composer psr-4 自动加载,命名空间错配或路径错误将导致“class not found”;无需继承特定父类,配置由 services.yaml 控制;推荐按功能分组子目录以提升可维护性。

自定义服务文件统一放在 src/ 目录下,按命名空间分层组织,路径必须与命名空间严格一致。
服务类必须放在 src/ 下,不能放别处
服务是可被自动加载的 PHP 类,Symfony 依赖 Composer 的 PSR-4 自动加载机制。只要你的类属于 App\ 命名空间(默认配置),就必须存放在 src/ 中对应子目录里:
-
src/Service/UserMailer.php→ 命名空间必须为App\Service -
src/Helper/ApiHelper.php→ 命名空间必须为App\Helper - 不能放在
config/、templates/、var/或根目录下——这些位置不会被自动加载
命名空间和目录路径要一一对应
Composer 根据 composer.json 中的 PSR-4 映射(如 "App\": "src/")来定位类。系统不会猜测路径,只做字面匹配:
- 类
App\Service\UserMailer必须位于src/Service/UserMailer.php - 若误写成
App\Services\UserMailer,但文件在src/Service/,则运行时报错“Class not found” - 移动文件或修改命名空间后,必须执行
composer dump-autoload更新自动加载映射
服务类本身无需特殊父类或接口
自定义服务就是普通 PHP 类,不强制继承或实现特定基类:
- 可以是纯逻辑工具类(如
PriceCalculator) - 可以依赖注入其他服务(如构造函数中接收
LoggerInterface) - 是否标记为
public、是否加@required注解、是否设为autowire: true,由config/services.yaml控制,和存放位置无关
推荐按功能分组子目录,保持结构清晰
虽然 Symfony 不限制子目录层级,但建议用语义化目录组织服务,便于维护和 IDE 导航:
-
src/Service/:通用业务服务(如订单处理、通知发送) -
src/Integration/:第三方对接服务(如支付网关、短信 SDK 封装) -
src/Domain/:领域模型相关服务(适合 DDD 风格项目) - 避免扁平堆积(如全放在
src/根下)或过度嵌套(如src/Services/Utils/Helpers/Tools/)











