<?php
declare(strict_types=1);

use app\components\web\User;
use app\models\LoginMethod;
use app\models\User as UserModel;
use app\models\UserLoginHistory;
use yii\web\UserEvent;

return (function (): array {
    $authKeyFile = dirname(__DIR__) . '/authkey-secret.php';
    $authKeySecret = @file_exists($authKeyFile)
        ? require($authKeyFile)
        : null;

    return [
        'class' => User::class,
        'identityFixedKey' => $authKeySecret,
        'identityClass' => UserModel::class,
        'identityCookie' => [
            'name' => '_identity',
            'httpOnly' => true,
            'secure' => (bool)preg_match(
                '/(?:^|\.)stat\.ink$/i',
                $_SERVER['HTTP_HOST'] ?? ''
            ),
        ],
        'enableAutoLogin' => $authKeySecret !== null,
        'loginUrl' => ['user/login'],
        'on afterLogin' => function (UserEvent $event): void {
            if (!$event->cookieBased) {
                // 通常ログインはこのフックでは記録しない。
                // 適切な箇所で UserLoginHistory::login() を呼び出すこと。
                return;
            }

            UserLoginHistory::login(
                Yii::$app->user->identity,
                LoginMethod::METHOD_COOKIE
            );
            UserModel::onLogin(
                Yii::$app->user->identity,
                LoginMethod::METHOD_COOKIE
            );
        },
    ];
})();

<?php
declare(strict_types=1);

use app\components\web\User;
use app\models\LoginMethod;
use app\models\User as UserModel;
use app\models\UserLoginHistory;
use yii\web\ServerErrorHttpException;
use yii\web\UserEvent;

return (function (): array {
    $authKeyFile = dirname(__DIR__) . '/authkey-secret.php';
    $authKeySecret = @file_exists($authKeyFile)
        ? require($authKeyFile)
        : null;

    return [
        'class' => User::class,
        'identityFixedKey' => $authKeySecret,
        'identityClass' => UserModel::class,
        'identityCookie' => [
            'name' => '_identity',
            'httpOnly' => true,
            'secure' => (bool)preg_match(
                '/(?:^|\.)stat\.ink$/i',
                $_SERVER['HTTP_HOST'] ?? ''
            ),
        ],
        'enableAutoLogin' => $authKeySecret !== null,
        'loginUrl' => ['user/login'],
        'on afterLogin' => function (UserEvent $event): void {
            if (!$event->cookieBased) {
                // 通常ログインはこのフックでは記録しない。
                // 適切な箇所で UserLoginHistory::login() を呼び出すこと。
                return;
            }

            $identity = Yii::$app->user->getIdentity();
            if (!$identity) {
                // なんでやねん
                throw new ServerErrorHttpException('Internal error while auto-login process');
            }

            UserLoginHistory::login($identity, LoginMethod::METHOD_COOKIE);
            UserModel::onLogin($identity, LoginMethod::METHOD_COOKIE);
        },
    ];
})();

Update cookie-based login process event
Update cookie-based login process event

エラーログによると、クッキーベースのログインをしたとき、
ログイン履歴を保存するためのフック関数において
https://github.com/fetus-hina/stat.ink/blob/ec679de7b6402be34edbff51a4b54b8cd6046a87/config/web/user.php#L38
の identity プロパティが見つからない時があるらしい。

この identity は \yii\web\User によって提供される getIdentity() の呼び出しになるはずなので
見つからないはずがないのだが、記録されているものは仕方がない。

なので、getter を明示的に呼び出すようにしてみた。
もしなぜか identity が null だったりすると例外を飛ばす
