Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Added chapter about the locale based on the user entity#4875

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
weaverryan merged 4 commits intosymfony:2.3frompeterrehm:locale-user-dependend
Mar 13, 2015
Merged
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletionscookbook/session/locale_sticky_session.rst
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -106,3 +106,112 @@ method::
{
$locale = $request->getLocale();
}

Setting the Locale Based on the User's Preferences
--------------------------------------------------

You might want to improve this technique even further and define the locale based on
the user entity of the logged in user. However, since the ``LocaleListener`` is called
before the ``FirewallListener``, which is responsible for handling authentication and
is setting the user token into the ``TokenStorage``, you have no access to the user
which is logged in.

Let's pretend you have defined a property "locale" in your user entity which you
want to be used as the locale for the given user. In order to achieve the wanted locale

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I find this phrase too long and a bit confusing. Maybe we should reword it or split it:

In order to achieve the wanted locale configuration you can set the localewhich is defined for the user to the session right after the login.

configuration, you can set the locale which is defined for the user to the session right
after the login. Fortunately, you can hook into the login process and update the user's
session before the redirect to the first page. For this you need an event listener for the
``security.interactive_login`` event:

.. code-block:: php

// src/AppBundle/EventListener/UserLocaleListener.php
namespace AppBundle\EventListener;

use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

/**
* Stores the locale of the user in the session after the
* login. This can be used by the LocaleListener afterwards.
*/
class UserLocaleListener
{
/**
* @var Session
*/
private $session;

public function __construct(Session $session)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Probably we need a blank line between the property and the constructor.

{
$this->session = $session;
}

/**

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

And here we probably need another blank line.

* @param InteractiveLoginEvent $event
*/
public function onInteractiveLogin(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();

if (null !== $user->getLocale()) {
$this->session->set('_locale', $user->getLocale());
}
}
}

Then register the listener:

.. configuration-block::

.. code-block:: yaml

# app/config/services.yml
services:
app.user_locale_listener:
class: AppBundle\EventListener\UserLocaleListener
arguments: [@session]
tags:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I think you forget to inject the session here

...arguments:[@session]

- { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin }

.. code-block:: xml

<!-- app/config/services.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
<service id="app.user_locale_listener"
class="AppBundle\EventListener\UserLocaleListener">

<argument type="service" id="session"/>

<tag name="kernel.event_listener"
event="security.interactive_login"
method="onInteractiveLogin" />
</service>
</services>
</container>

.. code-block:: php

// app/config/services.php
$container
->register('app.user_locale_listener', 'AppBundle\EventListener\UserLocaleListener')
->addArgument('session')
->addTag(
'kernel.event_listener',
array('event' => 'security.interactive_login', 'method' => 'onInteractiveLogin'
);

.. caution::

With this configuration you are all set for having the locale based on the user's
locale. If however the locale changes during the session, it would not be updated
since with the current implementation the user locale will only be stored to the
session on login. In order to update the language immediately after a user has
changed their language, you need to update the session after an update to
the user entity.

[8]ページ先頭

©2009-2025 Movatter.jp