Api Platform多GetCollection端点问题:URI格式引发404错误
问题原因与解决方案
问题根源
Api Platform的路由匹配按操作定义顺序执行,你代码里默认的Get单资源操作(路由默认是/sport_centers/{id})排在了自定义GetCollection集合操作(/sport_centers/top_reserves)前面。当请求/sport_centers/top_reserves时,系统会优先匹配/sport_centers/{id}规则,把top_reserves当成id参数去查找对应资源,找不到就返回404。而用/sport_centers_top_rated格式时,不会和单资源路由规则冲突,所以能正常匹配到自定义接口。
解决方法
方法1:调整操作定义顺序
把自定义的GetCollection操作移到默认Get操作前面,让路由匹配优先命中自定义集合接口:
#[ApiResource( operations: [ // 先定义自定义集合接口 new GetCollection( uriTemplate: '/sport_centers/top_reserves', controller: SportCenterReadController::class, normalizationContext: [ 'groups' => [ 'sport_center:read:top_rated' ] ], name: 'sport_center:read:list:top_reserves' ), // 再定义单资源Get操作 new Get( name: 'sport_center:read' ), // 其余操作保持不变 new Get( uriTemplate: '/sport_centers/{id}/sports', controller: SportCenterReadController::class, name: 'sport_center:read:sport_types' ), new Get( uriTemplate: '/sport_centers/{id}/reserves_availability', controller: SportCenterReadController::class, name: 'sport_center:read:reserves_availability' ), new GetCollection( uriTemplate: '/sport_centers', controller: SportCenterReadController::class, name: 'sport_center:read:list' ), new Post( uriTemplate: '/sport_centers', controller: SportCenterCreateController::class, name: 'sport_center:write:create' ), new Put( uriTemplate: '/sport_centers/{id}', controller: SportCenterUpdateController::class, denormalizationContext: [ 'groups' => [ 'sport_center:write:update', ] ], name: 'sport_center:write:update' ), new Delete( uriTemplate: '/sport_centers/{id}', controller: SportCenterDeleteController::class, name: 'sport_center:write:delete' ), ], // 其余配置保持不变 )]
方法2:给默认Get操作指定明确uriTemplate
如果不想调整顺序,给默认Get操作显式指定路由模板,避免模糊匹配:
new Get( uriTemplate: '/sport_centers/{id}', name: 'sport_center:read' ),
这样系统能清晰区分单资源路由和自定义集合路由,不会把top_reserves误判为id参数。
验证修改
修改后执行php bin/console cache:clear清除Symfony缓存,重新请求/sport_centers/top_reserves即可正常访问。
内容的提问来源于stack exchange,提问作者Sulex95
相关产品推荐
相关产品推荐

