通过sfGuard传递删除方法


Passing Delete Method Through sfGuard

我在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请求的操作,但我强烈建议您更改路由方案。