Возникли проблемы с установкой $ _SESSION ['lang'] - PullRequest
0 голосов
/ 27 апреля 2018

Я стою перед каким-то психом ... Надеюсь, кто-нибудь там может мне помочь !? : -)

Я создаю сайт с slim3, где я пытаюсь настроить локализацию на основе этого курса на CodeCourse , и кажется, что у меня возникают проблемы с настройкой моей сессии должным образом, так как я использую DI-Bridge, тогда как он не ...

Кажется, я не могу понять, ПОЧЕМУ это не удается в соответствии с трассировкой стека!?

Может кто-нибудь помочь, возможно?

Вот мой contaner.php

use function DI\get;
use Interop\Container\ContainerInterface;

use Slim\Csrf\Guard;
use Slim\Flash\Messages;
use Slim\Views\Twig;
use Slim\Views\TwigExtension;

use Illuminate\Translation\Translator;
use Illuminate\Translation\FileLoader;
use Illuminate\Filesystem\Filesystem;

//use Noodlehaus\Config;

use app\views\extensions\TranslationExtension;

use app\handlers\auth\Auth;
use app\handlers\errors\NotFoundHandler;

use app\models\data\About;
use app\models\data\Contact;
use app\models\data\Framework;
use app\models\data\Project;
use app\models\data\Service;
use app\models\data\Site;
use app\models\data\Testimonial;
use app\models\data\User;

use app\validation\contracts\ValidatorInterface;
use app\validation\Validator;
use app\validation\domain\DomainCheck;
use app\validation\email\EmailAvailable;
use app\validation\password\MatchesPassword;

return [

    /**
     * attaching : XX ->
     */
    /* ROUTER */
    'router' => get(Slim\Router::class),

    /* 404 ERROR */
    'notFoundHandler' => function(ContainerInterface $c) {

        return new NotFoundHandler ($c->get(Twig::class));
    },

    /* AUTH */
    Auth::class => function (ContainerInterface $c) {

        return new Auth;
    },

    /* CSRF */
    Guard::class => function (ContainerInterface $c) {

        return new Guard;
    },

    /* FLASH */
    Messages::class => function (ContainerInterface $c) {

        return new Messages;
    },

    /* VALIDATOR */
    ValidatorInterface::class => function (ContainerInterface $c) {

        return new Validator;
    },

    /* TRANSLATOR */
    Translator::class => function (ContainerInterface $c) {

        $fallback = $c->get('settings.translations.fallback');

        $loader = new FileLoader(
            new Filesystem(), $c->get('settings.translations.path')
        );

        $translator = new Translator($loader, $_SESSION['lang'] ?? $fallback);
        $translator->setFallback($fallback);

        return $translator;
    },

    /* TWIG */
    Twig::class => function (ContainerInterface $c) {
        $view = new Twig(__DIR__ . '/../resources/views', [
            'cache' => false
        ]);

        $view->addExtension(new TwigExtension(
            $c->get('router'),
            $c->get('request')->getUri()
        ));

        $view->addExtension(new TranslationExtension(
            $c->get(Translator::class)
        ));

        $view->getEnvironment()->addGlobal('flash', $c->get(Messages::class));

        $view->getEnvironment()->addGlobal('auth', [

            'check' => $c->get(Auth::class)->check(),
            'user' => $c->get(Auth::class)->user(),
        ]);

        return $view;
    },

    /**
     * attaching : RESPECT -> VALIDATION -> CUSTOM RULES
     */
    /* DOMAIN */
    DomainCheck::class => function (ContainerInterface $c) {

        return new DomainCheck;
    },

    /* EMAIL */
    EmailAvailable::class => function (ContainerInterface $c) {

        return new EmailAvailable;
    },

    /* PASSWORD */
    MatchesPassword::class => function (ContainerInterface $c) {

        return new MatchesPassword ($c->get(password));
    },

    /**
     * attaching : MODELS ->
     */
    /* ABOUT */
    About::class => function (ContainerInterface $c) {

        return new About;
    },

    /* CONTACT */
    Contact::class => function (ContainerInterface $c) {

        return new Contact;
    },

    /* FRAMEWORK */
    Framework::class => function (ContainerInterface $c) {

        return new Framework;
    },

    /* PROJECT */
    Project::class => function (ContainerInterface $c) {

        return new Project;
    },

    /* SERVICE */
    Service::class => function (ContainerInterface $c) {

        return new Service;
    },

    /* SITE */
    Site::class => function (ContainerInterface $c) {

        return new Site;
    },

    /* TESTIMONIAL */
    Testimonial::class => function (ContainerInterface $c) {

        return new Testimonial;
    },

    /* USER */
    User::class => function (ContainerInterface $c) {

        return new User;
    },
];

и вот мой TranslationController.php

<?php

namespace App\Controllers;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Router;

class TranslationController {

    /**
     * @param Request $request
     * @param Response $response
     * @param Router $router
     * @param $args
     *
     * @return mixed
     */
    public function switch(Request $request, Response $response, Router $router, $args) {

        if (isset($args['lang'])) {

            $_SESSION['lang'] = $args['lang'];
        }

        return $response->withRedirect($router->pathFor('home'));
    }
}

плюс маршрут для перевода:

<?php

/**
 * adding to view : LOCALIZATION
 */
$app->get('/translate/{lang}', ['app\controllers\TranslationController', 'switch'])->setName('translate.switch');

и, наконец, вот ошибка трассировки стека stack trace of the error

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

после небольшого осмотра и попытки / исправления, вот что в итоге и решило! :

public function switch(Request $request, Response $response, Router $router, $lang) { 

    if (isset($lang)) { 

        $_SESSION['lang'] = $lang;
    }

    return $response->withRedirect($router->pathFor('home'));
}
0 голосов
/ 27 апреля 2018

У меня нет большого опыта работы с PHP DI, но я бы предложил удалить аргумент $args и получить параметр через $request->getAttribute('lang').

<?php

namespace App\Controllers;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Router;

class TranslationController {

    /**
     * @param Request $request
     * @param Response $response
     * @param Router $router
     * @param $args
     *
     * @return mixed
     */
    public function switch(Request $request, Response $response, Router $router) {

        $_SESSION['lang'] = $request->getAttribute('lang');

        return $response->withRedirect($router->pathFor('home'));
    }
}
...