开发者

Passing Delete Method Through sfGuard

I have an application with people and groups in Symfony, where a person may have a membership with multiple groups. To remove a person from a group, I currently have an acti开发者_开发百科on in a 'groupMembers' module that takes a 'delete' method and removes the pair from a many-to-many entity 'group_membership'. The route currently looks something like this:

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]

To perform this action, the user needs to be logged in, so I restricted it using sfGuard in the module's security.yml:

remove:
  is_secure: true

So after clicking a 'remove' link, a user who isn't logged in is taken to the log in screen, but after clicking 'submit' the request is no longer a 'delete' but a 'get', meaning the similar add_to_group route is called instead!

add_to_group:
  url:    /group-membership/:group_id/:person_id
  param:  { module: groupMembers, action: create }
  ...

Is there any way to make sfGuard emulate a delete action and pass the parameters properly, or will I have to use a different route?


It seems that there is no way to achieve this without writing custom code or editing code of sfGuard plugin.

See plugins/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php (its executeSignin method for details) how sign in is handled.

sfGuard gets user referrer and performs redirect with appropriate method of sfAction. This redirect is performed by using http header Location. So browser will use GET method to receive url content.

You can override default signin action and perform redirects from remove_membership route to an action which will use sfBrowser component to emulate POST request, but I highly recommend you to change routing scheme.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜