Symfony 6.2如何使用MapEntity调用自定义查找器?
解决Symfony MapEntity处理MongoDB文档参数转换的报错问题
你的问题出在错误地将finder配置放入了mapping数组中,MapEntity的mapping仅用于关联URL参数与文档字段,而finder是独立的配置选项。
正确的写法
将finder作为单独参数传入MapEntity,mapping只定义URL参数slug对应MongoDB文档的id字段:
use Symfony\Bridge\Doctrine\Attribute\MapEntity; use App\Document\MyDocument; #[Route('/{slug}', methods: ['GET'])] public function get( #[MapEntity( class: MyDocument::class, mapping: ['slug' => 'id'], finder: 'CustomFinder' )] MyDocument $document ): JsonResponse { // 业务逻辑代码 }
关键注意事项
- 自定义查找器要求:确保
MyDocumentRepository中存在CustomFinder方法,方法需接收对应参数并返回MyDocument实例,示例如下:// src/Repository/MyDocumentRepository.php use Doctrine\ODM\MongoDB\Repository\DocumentRepository; class MyDocumentRepository extends DocumentRepository { public function CustomFinder(string $id): ?MyDocument { return $this->findOneBy(['id' => $id]); // 或自定义查询逻辑 } } - MongoDB ODM支持:确认已安装并配置
doctrine/mongodb-odm-bundle,MyDocument类需正确关联该Repository:// src/Document/MyDocument.php use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; #[MongoDB\Document(repositoryClass: MyDocumentRepository::class)] class MyDocument { #[MongoDB\Id] private ?string $id = null; // 其他字段与方法 } - 404处理:如果需要在找不到文档时返回404响应,可添加
notFoundHttpCode选项:#[MapEntity( class: MyDocument::class, mapping: ['slug' => 'id'], finder: 'CustomFinder', notFoundHttpCode: 404 )]
内容的提问来源于stack exchange,提问作者majksec
相关产品推荐
相关产品推荐

