带前缀的FOSUserBundle注销不起作用

时间:2013-02-18 17:29:30

标签: symfony localization fosuserbundle

我对symfony2和FOSUserBundle有一个非常奇怪的问题。

我可以使用/ en / logout注销,但不能使用/ nl / logout或/ fr / logout注销。

当我尝试使用nl或fr注销时,我得到:

You must activate the logout in your security firewall configuration.

虽然我配置了它。我似乎无法理解为什么/ en / logout工作而其余部分没有。

这是我的代码:

security.yml

security:
providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

encoders:
    FOS\UserBundle\Model\UserInterface: sha512

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            check_path: fos_user_security_check
            default_target_path: /%locale%/login
            always_use_default_target_path: true
            failure_path:   /%locale%/login
        logout:
            path: /%locale%/logout
            target: homepage
        anonymous:    true

routing.yml

user bundle > FOS
    fos_user_security:
        resource: "@FOSUserBundle/Resources/config/routing/security.xml"
        prefix: /{_locale}
        requirements:
            _locale: fr|nl|en

控制器

    class LoginController extends Controller {

    /**
     * @Route("{_locale}/logout-test", name="logout", defaults={"_locale"="en"} , requirements = {"_locale" = "fr|en|nl"})
     * @Template()
     */
    public function logoutAction()
    {
        $test = "";
        #throw new \RuntimeException('You must activate the logout in your security firewall configuration.');
        #return $this->redirect($this->generateUrl('homepage'));;
    }
}

任何人都可以帮助我,或者告诉我下一步该去哪儿?非常感谢

2 个答案:

答案 0 :(得分:31)

在配置文件中,您需要使用路由而不是URL。如果以“/”开头,则将其视为URL,否则将其视为路径。如果您使用路由而不是URL,则会自动处理区域设置。例如,这是我的security.yml配置:

security:
  public:
    pattern:   ^/
    form_login:
      login_path: fos_user_security_login
      check_path: fos_user_security_check
      provider: fos_userbundle
      csrf_provider: form.csrf_provider
      default_target_path: index
    anonymous: true
    logout:
      path: fos_user_security_logout
      target: index

答案 1 :(得分:0)

除了@ jfcartier的回答:

之外,我留待将来参考

如果您需要自定义logout路径而不是fos_user_security_logout

# app/config/security.yml
...
  logout:
     path: my_logout
     target: homepage

...然后您还需要在routing.yml中定义它:

# app/config/routing.yml
app:
    resource: "@AppBundle/Controller/"
    type:     annotation

my_logout:
    path: /logout

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

但是,请确保它在fos_user之前定义 - 否则您将收到相同的错误:您必须在安全防火墙配置中激活注销。