Как в yii2 установить cookies один раз если сразу несколько запросов?

В Yii2 установка cookies может быть выполнена с использованием класса yiiwebCookie, который позволяет установить параметры для создаваемой куки, такие как имя, значение, время жизни и т. д.

Чтобы установить cookies один раз при нескольких запросах, вам нужно использовать механизм Middleware, предоставляемый Yii2. Middleware - это уровень обработки запросов, который позволяет модифицировать запросы и ответы перед и после их обработки контроллером.

Ниже приведен пример кода, который демонстрирует, как использовать Middleware в Yii2 для установки cookies один раз при нескольких запросах:

namespace appcomponents;

use Yii;

class SetCookieMiddleware extends yiibaseBaseObject implements yiiwebMiddlewareInterface
{
    public function beforeAction($action)
    {
        if (!Yii::$app->request->cookies->has('my_cookie')) {
            $cookie = new yiiwebCookie([
                'name' => 'my_cookie',
                'value' => 'my_value',
                'expire' => time() + 3600, // Время жизни куки - 1 час
            ]);
            Yii::$app->response->cookies->add($cookie);
        }
        return true;
    }

    public function afterAction($action, $result)
    {
        return $result;
    }
}

В этом коде мы создаем класс SetCookieMiddleware, который реализует интерфейс yiiwebMiddlewareInterface. У нас есть два метода, beforeAction и afterAction. Метод beforeAction будет вызываться перед выполнением действия контроллера, и в нем мы проверяем, существует ли уже куки с именем "my_cookie". Если куки не существует, мы создаем новую куку с помощью класса yiiwebCookie и добавляем ее в список кук ответа с помощью свойства response->cookies.

Чтобы применить наш Middleware, нам нужно зарегистрировать его в файле config/web.php:

'components' => [
    'request' => [
        'cookieValidationKey' => 'your_cookie_validation_key',
        'csrfParam' => '_csrf-frontend',
        'csrfCookie' => [
            'httpOnly' => true,
            'sameSite' => yiiwebCookie::SAME_SITE_LAX,
        ],
        'parsers' => [
            'application/json' => yiiwebJsonParser::class,
        ],
        'on beforeSend' => [appcomponentsSetCookieMiddleware::class, 'beforeAction'],
    ],
],

В этом коде мы используем свойство on beforeSend, чтобы указать Yii2 вызывать метод beforeAction из нашего Middleware перед отправкой ответа.

Теперь каждый раз, когда выполнится запрос, Middleware будет проверять, существует ли уже куки с именем "my_cookie", и если нет, он установит новую куки. При этом гарантируется, что куки будут установлены только один раз, независимо от количества запросов.