Переменная Zf3 отсутствует в onBoostrap - PullRequest
0 голосов
/ 26 апреля 2020

Я оцениваю 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 в качестве параметров конструкции.

Любая помощь будет очень признательна.

...