Я оцениваю Laminas Skeleton и добавляю ссылку (Fr | En) для перевода. При нажатии на ссылку я вызываю действие, которое добавляет в сеанс переменную (содержащую выбранный язык), а затем перезагружает страницу, чтобы применить изменения. Переменная lanaguage в сеансе установлена правильно, но при перезагрузке страницы она удаляется, и я не знаю почему: Вот мой файл модуля:
<?php
/**
* @see https://github.com/laminas/laminas-mvc-skeleton for the canonical source repository
* @copyright https://github.com/laminas/laminas-mvc-skeleton/blob/master/COPYRIGHT.md
* @license https://github.com/laminas/laminas-mvc-skeleton/blob/master/LICENSE.md New BSD License
*/
declare(strict_types=1);
namespace Application;
use Laminas\Mvc\MvcEvent;
use Laminas\Mvc\Controller\AbstractActionController;
use Application\Service\AuthManager;
use Application\Controller\AuthController;
use Laminas\Session\SessionManager;
class Module
{
public function getConfig() : array
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event){
// Au demarrage, on va initialiser tous nos hiahi truc pour chose ici
// Get event manager.
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
// Register the event listener method.
$sharedEventManager->attach(AbstractActionController::class,
MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
$serviceManager = $event->getApplication()->getServiceManager();
$sessionManager = $serviceManager->get(SessionManager::class);
$this->forgetInvalidSession($sessionManager);
// Get language settings from session.
$container = $serviceManager->get('I18nSessionContainer');
$languageId = 'en_US';
if (isset($container->languageId)){
$languageId = $container->languageId;
}
var_dump($container->languageId);
\Locale::setDefault($languageId);
$translator = $serviceManager->get('translator');
$translator->addTranslationFile(
'ini',
__DIR__ . '/../../../data/translations/'.$languageId.'.ini',
'default',
$languageId
);
$translator->addTranslationFilePattern(
'ini',
__DIR__ . '/../../../data/translations',
'%s.ini',
'default'
);
//\Laminas\Validator\AbstractValidator::setDefaultTranslator(new \Laminas\I18n\Translator\Translator($translator));
//$this->forgetInvalidSession($sessionManager);
}
protected function forgetInvalidSession($sessionManager)
{
try {
$sessionManager->start();
return;
} catch (\Exception $e) {
}
/**
* Session validation failed: toast it and carry on.
*/
// @codeCoverageIgnoreStart
//session_unset();
// @codeCoverageIgnoreEnd
}
public function onDispatch(MvcEvent $event){
$controller = $event->getTarget();
$controllerName = $event->getRouteMatch()->getParam('controller', null);
$actionName = $event->getRouteMatch()->getParam('action', null);
// Convert dash-style action name to camel-case. Je pense pas avoir besoin de celui la.
$actionName = str_replace('-', '', lcfirst(ucwords($actionName, '-')));
// Get the instance of AuthManager service.
$authManager = $event->getApplication()->getServiceManager()->get(AuthManager::class);
// Execute the access filter on every controller except AuthController
// (to avoid infinite redirect).
if ($controllerName!=AuthController::class && !$authManager->filterAccess($controllerName, $actionName)) {
return $controller->redirect()->toRoute('connexion'); // La route qui a ete definie dans le fichier de config
}
}
}
Мой контроллер и действие для переключения языка здесь:
namespace Commun\Controller;
use Commun\Controller\NslabsAbstractController;
class LocaleController extends NslabsAbstractController
{
public function switchLocaleAction()
{
$locale = $this->post['locale'];
if (empty($locale)) {
$locale = 'fr';
}
$lang = $locale;
switch ($lang) {
case 'fr':
$this->sessionManager->i18nSessionContainer->languageId = 'fr_FR';
break;
case 'en':
$this->sessionManager->i18nSessionContainer->languageId = 'en_US';
break;
default :
$this->sessionManager->i18nSessionContainer->languageId = 'fr_FR';
}
return new \Laminas\Http\Response();
}
}
Я должен сказать, что все мои контроллеры расширяют AbstractActionController, в который я добавил ServiceManager и Session Manager в качестве параметров конструкции.
Любая помощь будет очень признательна.