我在Symfony中有一个关于人和组的应用程序,其中一个人可能拥有多个组的成员资格。要从组中删除一个人,我目前在'groupMembers'模块中有一个操作,该操作采用'delete'方法,并从多对多实体'group_membership'中删除对。当前路由看起来像这样:
remove_membership:
url: /group-membership/:group_id/:person_id
class: sfPropelRoute
options: { model: GroupMembership, type: object }
param: { module: groupMembers, action: remove }
requirements:
sf_method: [delete]
要执行此操作,用户需要登录,因此我在模块的security.yml中使用sfGuard对其进行限制:
remove:
is_secure: true
因此,在点击"删除"链接后,未登录的用户被带到登录屏幕,但在点击"提交"后,请求不再是"删除",而是"获取",这意味着调用类似的add_to_group路由!
add_to_group:
url: /group-membership/:group_id/:person_id
param: { module: groupMembers, action: create }
...
是否有任何方法可以使sfGuard模拟删除操作并正确传递参数,或者我必须使用不同的路由?
如果不编写自定义代码或编辑sfGuard插件的代码,似乎没有办法实现这一点。
参见plugins/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php
(其executeSignin
方法的详细信息)如何处理登录。
sfGuard
获得用户引用,并使用适当的sfAction方法进行重定向。此重定向是通过使用http头Location
来执行的。因此浏览器将使用GET方法来接收url内容。
您可以覆盖默认的signin
操作,并执行从remove_membership
路由重定向到将使用sfBrowser
组件模拟POST请求的操作,但我强烈建议您更改路由方案。