登录后Symfony3语言环境(重定向到默认场所)



我在Symfony Project具有Symfony版本3.1.10中有问题。我让这个项目完成翻译,这是我与Symfony的第一次会面。

这里有什么问题:我有两种语言de和en,默认语言是de。当有人转到登录页面或主页(其中也为登录表单(然后切换到en并输入到登录时,登录后,其更改为/de/默认语言。我花了几天的时间在这个错误上,真的需要帮助。我尝试了一切,但仍然没有进步。

我遵循Symfony文档,如何配置翻译,如何使用粘性用户会话,而我创建了所有内容,但是错误在那里。我将在下面显示我的代码:

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
parameters:
    locale: de
framework:
    #esi:             ~
    translator:      { fallbacks: ["%locale%"] }
    default_locale:  "%locale%"

app/config/routing.yml

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"
app:
    resource: "@AppBundle/Controller/"
    type:     annotation
proreg:
    path:     /{_locale}/product/registration
    defaults:  { _controller: ProductRegistrationControllerProductRegistrationController::productRegistrationAction }
prolist:
    path:     /{_locale}/profile/products
    defaults:  { _controller: ProductRegistrationControllerProductRegistrationController::listAction }
prodel:
    path:     /{_locale}/profile/products/delete/{id}
    defaults:  { _controller: ProductRegistrationControllerProductRegistrationController::deleteAction }
proadd:
    path:     /{_locale}/product/register
    defaults:  { _controller: ProductRegistrationControllerProductRegistrationController::createAction }

app/config/security.yml

security:
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email
    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                login_path:   fos_user_security_login
                # csrf_token_generator: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
                always_use_default_target_path: false
            logout:       true
            anonymous:    true
            # http_basic: ~
            # http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
            # form_login: ~
            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html
    encoders:
        FOSUserBundleModelUserInterface: bcrypt
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }
        - { path: ^/sso/login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/sso/settoken, role: ROLE_ADMIN }
        - { path: ^/profile/products, role: ROLE_ADMIN }
        - { path: ^/product/registration, role: ROLE_ADMIN }

app/resources/fosuserbundle/all.xml

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    <import
        resource="@FOSUserBundle/Resources/config/routing/security.xml"/>
    <import
        resource="@FOSUserBundle/Resources/config/routing/profile.xml"
        prefix="/{_locale}/profile" />
    <import
        resource="@FOSUserBundle/Resources/config/routing/registration.xml"
        prefix="/{_locale}/register" />
    <import
        resource="@FOSUserBundle/Resources/config/routing/resetting.xml"
        prefix="/{_locale}/resetting" />
    <import
        resource="@FOSUserBundle/Resources/config/routing/change_password.xml"
        prefix="/{_locale}/profile" />
</routes>

app/resources/fosuserbundle/security.xml

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    <route id="fos_user_security_login" path="/{_locale}/login" methods="GET POST">
        <default key="_controller">FOSUserBundle:Security:login</default>
    </route>
    <route id="fos_user_security_check" path="/login_check" methods="POST">
        <default key="_controller">AppBundle:Security:check</default>
    </route>
    <route id="fos_user_security_logout" path="/logout" methods="GET POST">
        <default key="_controller">FOSUserBundle:Security:logout</default>
    </route>
</routes>

src/appbundle/controller/defaultcontroller.php

<?php
namespace AppBundleController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentSecurityCoreSecurity;
use SymfonyBundleSecurityBundleSecurityBundle;
use SymfonyComponentHttpFoundationRequest;
use DoctrineORMEntityManager;
class DefaultController extends Controller
{
    /**
     * @Route("/{_locale}", name="homepage", defaults={"_locale": "de"})
     */
    public function indexAction(Request $request)
    {
        // replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
        ]);
    }

src/appbundle/controller/securityController.php

<?php
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
// src/UserBundle/Controller/SecurityController.php
namespace AppBundleController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
use FOSUserBundleControllerSecurityController as BaseController;
class SecurityController extends BaseController
{
    public function loginAction(Request $request)
    {
        $response = parent::loginAction(request);
        // ... do custom stuff
      $errors->messageData = "Test";
      $errors->messageKey = "test";
        $error = $error ? $error : $errors;
        return $this->renderLogin(array(
            'last_username' => $lastUsername,
            'error' => $error,
            //'csrf_token' => $csrfToken,
            'origin' => $request->get("origin")));
    }
    public function checkAction()
    {
        $response = parent::checkAction();
        die  ("<pre>" .print_r($response). "</pre>");
    }
}

src/appbundle/event/localelistener.php

// src/AppBundle/LocaleListener.php
namespace AppBundleEvent;
use SymfonyComponentHttpKernelEventGetResponseEvent;
use SymfonyComponentHttpKernelKernelEvents;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;
    public function __construct($defaultLocale = 'de')
    {
        $this->defaultLocale = $defaultLocale;
    }
    public function onKernelRequest(GetResponseEvent $event)
    {
       $request = $event->getRequest();
       if (!$request->hasPreviousSession()) {
           return;
        }
        //print_r($request->get('_locale'));
        // try to see if the locale has been set as a _locale routing parameter
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // if no explicit locale has been set on this request, use one from the session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }
    public static function getSubscribedEvents()
    {
        return array(
            // must be registered after the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
        );
    }
}

登录表单

<form action="{{ path("fos_user_security_check") }}" method="post" id="login-form" class="col-xs-12">
<div class="content">
   <h2>{{ 'index.login.regcust'|trans }}</h2>
   <p>{{ 'index.login.haveaccount'|trans }}</p>
   <ul class="form-list">
      <li class="form_element">
         <label for="email" class="required">{{ 'index.login.email'|trans }}<em>*</em></label>
         <div class="input-box"> 
            <input type="hidden" name="origin" value="{{ origin }}" />
            <input type="hidden" name="_target_path" value="{{ path("setSSOToken") }}" />
            <input type="email" name="_username" value="" id="username" class="input-text required-entry validate-email" title="{{ 'index.login.email'|trans }}">
         </div>
      </li>
      <li class="form_element">
         <label for="pass" class="required">{{ 'index.login.password'|trans }}<em>*</em></label>
         <div class="input-box input-box-password">
            <input type="password" name="_password" class="input-text required-entry" id="password" title="{{ 'index.login.password'|trans }}">
            <!--a href="" class="f-left forgot-password">{{ 'index.login.forgot'|trans }}</a-->
         </div>
      </li>
   </ul>
   <p class="required required_hint">
      <em>*</em> {{ 'index.login.required'|trans }}
   </p>
</div>
<div class="buttons-set">
   <div class="button_wrapper">
      <button type="submit" class="button" title="Anmelden" name="send" id="send2"><span><span>{{ 'index.login.submit'|trans }}</span></span></button>
   </div>
</div>
</form>

如果有人可以帮助我解决这个问题,我将非常感谢。谢谢

好吧,我确定这与您的配置有关。让我们再试一次时间:

1(在src/appbundle/event/localelistener.php更改

namespace AppBundleEvent;

to

namespace AppBundleEventListener;

并确保根据https://symfony.com/doc/3.1/session/locale_sticky_session.html注册它:

services:
app.locale_listener:
    class: AppBundleEventListenerLocaleListener
    arguments: ['%kernel.default_locale%']
    tags:
        - { name: kernel.event_subscriber }

2(删除

/{_locale}

来自app/resources/fosuserbundle/security.xml和附加

prefix="/{_locale}"

to

<import
    resource="@FOSUserBundle/Resources/config/routing/security.xml"

在应用程序/资源/fosuserbundle/all.xml中。这主要只是将配置放在一个地方。

3(确保您有

firewalls:
    main:
        form_login:
            login_path: fos_user_security_login
            check_path: fos_user_security_check
            default_target_path: <your_desired_route>
        logout:
            path: fos_user_security_logout

在app/config/security.yml中带有语言环境。

4(在app/config/security.yml中,您应该为access_control定义正确的路径:

access_control:
    - { path: ^/(en|de)/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/admin/, role: ROLE_ADMIN }
    - { path: ^/(en|de)/sso/login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|de)/sso/settoken, role: ROLE_ADMIN }
    - { path: ^/(en|de)/profile/products, role: ROLE_ADMIN }
    - { path: ^/(en|de)/product/registration, role: ROLE_ADMIN }

包括地区。否则,这些路径将不会受到防火墙的保护。另外,您应该确保注册,重置和其他任何路由与FosuserBundle中的路线相对应。

编辑

看起来这与另一个改变了fosuserbundle行为的控制器有关。

最新更新