Kentavr16
@Kentavr16
long cold winter

Почему не удается получить значение куки из request?

есть примитивный мидлвер, который устанавливает куку с количеством обращений к серверу
public function handle(Request $request, Closure $next): Response
    {
        $counter = $request->cookie("counter");
        if ($counter === null){
            $counter = 0;
        }
        $data = $counter+1;
        return $next($request)->cookie("counter","$data",10);
    }

есть контроллер, который отображает значение этой куки
public function show(Request $request)
    {
        $cookieReq = $request->cookie("counter");
        $cookieSup =$_COOKIE['counter'];
        return ("из суперглобальной переменной - $cookieSup, request - $cookieReq");
    }

При этом $cookieSup выводит значение, тогда как $cookieReq - null. Почему?
П.С. - почти(но не совсем) дубликат вопроса, на который ответ так и не был дан.
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
смотрите. функция $next($request) передает реквест дальше в обработку. это "дальше в обработку" включает в себя и экшен в контролере. Это используется например для того что бы после всех обработок - навешать еще какой нибудь обработчик который что то сделает с тем контентом который создал контроллер.
В качестве примера пример собственно из EncryptCookies, наверное пример из самой ларки будет понятнее
public function handle($request, Closure $next)
    {
        return $this->encrypt($next($this->decrypt($request)));
    }

Собственно порядок выполнения: расшифровываем куки, передаем управление дальше в остальные middleware и controller, получив результат зашифровываем куки.

2. Сильное подозрение что вы что то навертели в куках. А именно ларка куки шифрует. По этому в $_COOKIE['counter'] у вас должна лежать абракадабра - которую вы прочитать не сможете. Если там лежит число - то его не сможет прочитать ларка потому что она ждет что там будет что то шифрованное.

3. А навертели вы следующее - исходя из 1 пункта, установка куки пролетает мимо middleware EncryptCookies и скорее всего отдается в чистом виде - и по этому при обновлении страницы Ларка не может эту куку прочитать.

Решение - добавить counter в $except в миддлеваре EncryptCookies или ставить ее раньше, посмотреть часть доки Ларки посвященному обработке запроса, и не трогать при работе с Ларкой $_GET, $_POST, $_COOKIE
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы