Передача метода удаления через sfGuard

У меня есть приложение с людьми и группами в Symfony, где человек может иметь членство в нескольких группах. Чтобы удалить человека из группы, в настоящее время у меня есть действие в модуле «groupMembers», которое использует метод «удалить» и удаляет пару из объекта «многие ко многим» «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]

Чтобы выполнить это действие, пользователь должен войти в систему, поэтому я ограничил его с помощью sfGuard в модуле security.yml:

remove:
  is_secure: true

Таким образом, после нажатия ссылки «удалить» пользователь, который не вошел в систему, попадает на экран входа в систему, но после нажатия «отправить» запрос больше не «удалить», а «получить», что означает аналогичный add_to_group Вместо этого вызывается маршрут!

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

Есть ли способ заставить sfGuard эмулировать действие удаления и правильно передавать параметры, или мне придется использовать другой маршрут?


person Druckles    schedule 28.07.2011    source источник


Ответы (1)


Кажется, что нет способа добиться этого без написания собственного кода или редактирования кода плагина sfGuard.

См. plugins/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php (его метод executeSignin для получения подробной информации), как обрабатывается вход.

sfGuard получает реферер пользователя и выполняет перенаправление с помощью соответствующего метода sfAction. Это перенаправление выполняется с использованием заголовка http Location. Таким образом, браузер будет использовать метод GET для получения содержимого URL-адреса.

Вы можете переопределить действие signin по умолчанию и выполнить перенаправление с маршрута remove_membership на действие, которое будет использовать компонент sfBrowser для эмуляции запроса POST, но я настоятельно рекомендую вам изменить схему маршрутизации.

person Alik    schedule 28.07.2011
comment
Это то, что я должен был сделать, к сожалению. Спасибо за помощь. - person Druckles; 29.07.2011