сессии

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iamguruman
Сообщения: 117
Зарегистрирован: 2018.05.10, 08:26

сессии

Сообщение iamguruman »

код контроллера:

Код: Выделить всё

    public function actionQuantity(){

        $nom_id = Yii::$app->request->post("CartItem")['nom_id'];
        $quantity = Yii::$app->request->post("CartItem")['quantity'];

        $session = Yii::$app->session;

        if ($session->isActive){
            echo "1";
        } else {
            echo "2";
        }

        $session->set('language', 'ru');

        print_r($_SESSION);
        echo "<hr>";
        print_r($session);
        die();

        $this->redirect($_SERVER['HTTP_REFERER']);
    }
    
результат:

$session->isActive: 2

Почему сессия isActive == 2?.. Поидее, я же ее открыл

print_r($_SESSION):
Array ( [__flash] => Array ( ) [cart] => 1 [cart.nom_id] => 195 [cart.quantity] => 100 [language] => ru )

print_r($session):
yii\web\Session Object ( [flashParam] => __flash [handler] => [_cookieParams:yii\web\Session:private] => Array ( [httponly] => 1 ) [frozenSessionData:yii\web\Session:private] => [_hasSessionId:yii\web\Session:private] => [_events:yii\base\Component:private] => Array ( ) [_eventWildcards:yii\base\Component:private] => Array ( ) [_behaviors:yii\base\Component:private] => )

Почему в print_r($session) не выводятся [cart] => 1 [cart.nom_id] => 195 [cart.quantity] => 100 [language] => ru ?

Prooksius
Сообщения: 57
Зарегистрирован: 2019.01.17, 23:24

Re: сессии

Сообщение Prooksius »

А в конфиге в Компонентах есть настройки сессии?

Код: Выделить всё

    'components' => [
	...
        'session' => [
            // this is the name of the session cookie used for login on the frontend
            'name' => 'advanced-frontend',
        ],
        ...

iamguruman
Сообщения: 117
Зарегистрирован: 2018.05.10, 08:26

Re: сессии

Сообщение iamguruman »

По видимому нет:

Код: Выделить всё

$config = [
    'id' => 'minimal',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
            'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '....',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => require(__DIR__ . '/db.php'),

        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],

    ],
    'params' => $params,
];
А как добавить правильно, чтобы сессия хранилась в "сессии", а не в бд??

нашел пример для БД:

Код: Выделить всё

    'components' => [
        'session' => [
            'class' => 'yii\web\DbSession',
            // 'db' => 'mydb',  // ID компонента для взаимодействия с БД. По умолчанию 'db'.
            // 'sessionTable' => 'my_session', // название таблицы для хранения данных сессии. По умолчанию 'session'.
        ],
    ],
];
но мне такой вариант не подходит

skynin
Сообщения: 263
Зарегистрирован: 2017.12.12, 10:09

Re: сессии

Сообщение skynin »

iamguruman писал(а):
2020.05.15, 17:38

Код: Выделить всё

    public function actionQuantity(){

        $nom_id = Yii::$app->request->post("CartItem")['nom_id'];
        $quantity = Yii::$app->request->post("CartItem")['quantity'];

        $session = Yii::$app->session;

        if ($session->isActive){
            echo "1";
        } else {
            echo "2";
        }
    }
    
Почему сессия isActive == 2?.. Поидее, я же ее открыл
Когда вы ее открыли? В коде вы ее не открывали.

Yii2: Разбираемся с сессиями
https://p0vidl0.info/yii2-razbiraemsya-s-sessiyami.html

$session = Yii::$app->session;

// проверяем наличие открытой сессии
if ($session->isActive) ...

// открываем сессию
$session->open();

iamguruman
Сообщения: 117
Зарегистрирован: 2018.05.10, 08:26

Re: сессии

Сообщение iamguruman »

нашел такой вариант класса: yii\web\CacheSession

конфиг теперь:

Код: Выделить всё

$config = [
    'id' => 'minimal',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
            'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '.....',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'session' => [
            'class' => 'yii\web\CacheSession',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
использовал его и переписал чуть код добавления товара в корзину

Код: Выделить всё

    public function actionQuantity(){

        $nom_id = Yii::$app->request->post("CartItem")['nom_id'];
        $quantity = Yii::$app->request->post("CartItem")['quantity'];

        $session = Yii::$app->session;

        $session->open();

        if(!$session->has('cart')){
            $session->set('cart', []);
            $cart = [];
        } else {
            $cart = $session->get('cart');
        }

        if(isset($cart['items'][$nom_id])){
            // товар есть в корзине, изменяем количество

            $cart['items']['nom_id']['quantity'] = $cart['items']['nom_id']['quantity'] + $quantity;
            $cart['items']['nom_id']['price'] = 1;


        } else {
            // товара нет в корзине, добавляем в коризину

            $cart['items']['nom_id']['quantity'] = $quantity;
            $cart['items']['nom_id']['price'] = 1;

        }

        $amount = 0.0;
        foreach ($cart['items'] as $item) {
            //$amount = $amount + $item['price'] * $item['count'];
            $amount = $amount + $item['quantity'];
        }
        $cart['amount'] = $amount;

        $session->set('cart', $cart);

        echo "<pre>";
        print_r($session->get('cart'));
        die();

        $this->redirect($_SERVER['HTTP_REFERER']);
    }
    
но почему-то не запоминается значение сессии....

такое впечателние что количество в корзине 0 этой позиции....
хотя ее я добавляю каждый раз...

поставил в форме количество 99: https://prnt.sc/shfqlt
нажал сабмит и результат: https://prnt.sc/shfr1t
жму назад и снова вбиваю 5: https://prnt.sc/shfrde
результат 5, а должен быть 104: https://prnt.sc/shfrn0

не понимаю... :evil: :cry: :?

skynin
Сообщения: 263
Зарегистрирован: 2017.12.12, 10:09

Re: сессии

Сообщение skynin »

iamguruman писал(а):
2020.05.15, 18:26
нашел такой вариант класса: yii\web\CacheSession

не понимаю... :evil: :cry: :?
вот, случайно в другой теме отвечал

я тоже не понимаю, почему люди ищут себе головняк, когда он им не нужен?

ну прочтите документацию
yii\web\Session отвечает за работу сессий

зачем вы хотите какой-то другой?
нашел такой вариант класса: yii\web\CacheSession
нашли на свою голову? не работает?
ну так и не ищите, сделайте все по книжке :)

https://www.yiiframework.com/doc/guide/ ... ns-cookies

Пользовательское хранилище для сессии

По умолчанию класс yii\web\Session сохраняет данные сессии в виде файлов на сервере. Однако Yii предоставляет ряд классов, которые реализуют различные способы хранения данных сессии:

yii\web\DbSession: сохраняет данные сессии в базе данных. (вы накатили миграцию БД для использования этого компонента?)
yii\web\CacheSession: хранение данных сессии в предварительно сконфигурированном компоненте кэша (вы настроили кэш, для использования этого компонента?)
yii\redis\Session: хранение данных сессии в redis. (вы подняли у себя Redis, на том порту?)
yii\mongodb\Session: хранение сессии в MongoDB. (вы подняли у себя MongoDB, на том порту?)

то есть - если вы решили взять что-то покруче - вы сделали что нужно для того чтобы это покруче - работало правильно?

а дальше, может у вас сам php не настроен. отключены сессии вообще, и все.
кто ж вас знает :)

iamguruman
Сообщения: 117
Зарегистрирован: 2018.05.10, 08:26

Re: сессии

Сообщение iamguruman »

Конфиг поменял, поставил yii\web\Session

Код: Выделить всё

$config = [
    'id' => 'minimal',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
            'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '...',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'session' => [
            'class' => 'yii\web\Session',
        ],
но пока результат не изменился, почему-то не обновляется количество...
такое впечатление что 0
почему такое может быть?

skynin
Сообщения: 263
Зарегистрирован: 2017.12.12, 10:09

Re: сессии

Сообщение skynin »

iamguruman писал(а):
2020.05.15, 18:40
такое впечатление что 0
почему такое может быть?
по многим причинам. обычно простым.

например - а вы знаете как работает сессионность? вот вообще - как между http запросами сервер выбирает из сохраненных сессий ту что нужно?
обычно это - кукис. у вас кукисы ходят правильно?
а вы их отправляете?

echo "<pre>";
print_r($session->get('cart'));
die(); // вот это случайно не сбрасывает ли отправку куки сессии?

посмотрите в браузере, в дев панели

iamguruman
Сообщения: 117
Зарегистрирован: 2018.05.10, 08:26

Re: сессии

Сообщение iamguruman »

Спасибо за помощь с yii\web\Session

Еще одну ошибку нашел:

Код: Выделить всё

        if(isset($cart['items'][$nom_id])){
            // товар есть в корзине, изменяем количество

            $cart['items'][$nom_id]['quantity'] = $cart['items'][$nom_id]['quantity'] + $quantity;
            $cart['items'][$nom_id]['price'] = 1;


        } else {
            // товара нет в корзине, добавляем в коризу

            $cart['items'][$nom_id]['quantity'] = $quantity;
            $cart['items'][$nom_id]['price'] = 1;

        }
'nom_id' заменил на $nom_id

Теперь работает. Спасибо

Ответить