yiisoft / yii2-app-basic

Yii 2.0 Basic Application Template
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
657 stars 788 forks source link

Виджет Alert работает неверно #223

Open wartur opened 4 years ago

wartur commented 4 years ago

Дело в том, что он всегда стартует сессию. А это неверное поведение. Мое мнение, что не нужно запускать сессию, если на то нет явных причин.

На строке 52 https://github.com/yiisoft/yii2-app-basic/blob/master/widgets/Alert.php#L52

Требуется за место

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

Напиасть:

$session = Yii::$app->session;
if (empty($session->getHasSessionId())) {
    return null;
}

Тогда все будет работать отлично!

YiiRocks commented 4 years ago

You can use Alert without session in \yii\bootstrap\Alert::widget. In the code you link to it is required, as it is used for Flash Messages.

samdark commented 4 years ago

As @Thoulah noted, it won't work because it needs session to read flash messages.

wartur commented 4 years ago

@samdark Я понимаю, что требуются сессии. Может быть меня не правильно поняли? Соль состоит в том, что, если нет сессионной куки, то её не нужно стартовать вхолостую. У меня тут 300к обращений в сутки от поисковых движков, зачем мне нужно держать в базе данных лишних 13 тысяч гарантированно холостых сессий в час?

Если нет Сесссионной куки, значит и Алертов нет. Все. Все логично.

По сути говоря, Yii::$app->user->isGuest работает абсолютно верно, там сначала идет проверка того, есть ли сессионная кука, если есть, то он идет дальше, иначе стопится НЕ стартуя сессию. Тоже самое надо реализовать в этом шаблоне и все.

Кстати я помню, что именно я этот баг в свое время находил именно внутри фреймворка, а тут тоже самое только с виджетом, ну не надо сессию дергать и стартовать без надобности. https://github.com/yiisoft/yii2/issues/13059

samdark commented 4 years ago

Оно фейлит тесты в advanced как минимум...

pyostrike commented 2 years ago

Можно написать так например:

        $session = Yii::$app->session;
        if (!$session->getIsActive()) {
            return null;
        }