php - Explain Symfony's "sticky" locale event listener -
symfony's cookbook proposes following recipe make locale "sticky" during user's session:
class localelistener implements eventsubscriberinterface { private $defaultlocale; public function __construct($defaultlocale = 'en') { $this->defaultlocale = $defaultlocale; } public function onkernelrequest(getresponseevent $event) { $request = $event->getrequest(); if (!$request->hasprevioussession()) { return; } // try see if locale has been set _locale routing parameter if ($locale = $request->attributes->get('_locale')) { $request->getsession()->set('_locale', $locale); } else { // if no explicit locale has been set on request, use 1 session $request->setlocale($request->getsession()->get('_locale', $this->defaultlocale)); } } public static function getsubscribedevents() { return array( // must registered before default locale listener kernelevents::request => array(array('onkernelrequest', 17)), ); } }
can explain following 3 points:
- why
return
if! $request->hasprevioussession()
? - int following
if/else
, why set locale$request->getsession()->set('_locale')
inif
block? why not using$request->setlocale()
inelse
block? - what "must registered before default locale listener" mean?
this event make _locale
it's been submitted current request though may come session (but _locale
might in request - e.g. when user changes locale - in case updated session object new value).
to answer questions.
if there no session object, skip event redundant (value cannot in session doesn't exist).
sync
_locale
's value between session , request, favoring request's version.as localelistener event handles locale issues, above needs happen before event runs. onkernelrequest 1 of first events gets triggered can sure case.
Comments
Post a Comment