如何在Phabricator中开发可删除事务评论的Delete端点
解答
是否可以开发删除事务评论的Delete端点?
可以实现该功能,Phabricator的扩展开发机制支持自定义接口端点,但需要严格遵循Phabricator的数据关联规则、权限校验逻辑,避免出现数据不一致问题。
原有代码无法运行的原因
你提供的代码是针对PhabricatorFlag(标记)模型的删除逻辑,和事务评论对应的PhabricatorTransactionComment模型的依赖处理逻辑完全不匹配,硬删会跳过权限校验、关联数据更新、操作日志记录等必要步骤,因此无法正常运行。
具体实现步骤
- 第一步:完成基础校验,先查询到目标评论对象,同时校验当前用户的操作权限,确保用户有权限删除该评论:
$user = $request->getUser(); // 从请求参数中获取要删除的评论ID $comment_id = $request->getInt('commentID'); // 按ID查询评论,自动应用基础权限过滤 $comment = id(new PhabricatorTransactionCommentQuery()) ->setViewer($user) ->withIDs([$comment_id]) ->executeOne(); if (!$comment) { return new Aphront404Response(); } // 强校验编辑权限,仅评论作者、管理员或对应资源的编辑者可删除评论 PhabricatorPolicyFilter::requireCapability( $user, $comment, PhabricatorPolicyCapability::CAN_EDIT ); - 第二步:调用官方内置的编辑器处理删除逻辑,不要直接调用
delete()方法删除评论记录,否则会导致feed流、搜索索引、评论计数等关联数据出现异常:$comment->getConfiguredEditor() ->setActor($user) ->setDeleteComment(true) ->setContentSource(PhabricatorContentSource::newFromRequest($request)) ->applyTransactions($comment->getObject(), []); - 第三步:构造返回结果,可根据业务需求返回删除成功标识,或返回更新后的评论列表数据即可。
内容的提问来源于stack exchange,提问作者Dicky Arisandi
相关产品推荐
相关产品推荐

