Прежде всего, я определяю «анонимного пользователя» как пользователя, который входит в игру через «гостевой логин». Это способ в одно касание создать новый гостевой аккаунт и войти в игру, чтобы попробовать что-то новое, не сообщая свой email и не заучивая новый пароль.
С этим покончено…
В сфере PBBG (постоянных браузерных игр) я вижу наболевшую проблему — игры, у которых на главной странице нет практически никакой информации, кроме формы входа и регистрации.
Новые игроки хотят знать, что из себя представляет ваша игра! И большинство людей не хотят заполнять регистрационную форму, чтобы взглянуть на нее.
Самое простое (и наиболее часто запрашиваемое) решение для начала — добавить скриншоты на домашнюю страницу. Покажите потенциальным игрокам, как выглядит ваша игра. Объясните основные особенности. Продавайте свою игру!
Следующее лучшее решение (на мой взгляд) — добавить гостевой вход.
Позвольте вашим будущим игрокам нажать одну кнопку, войти в игру и попробовать свои силы. И все это без каких-либо обязательств.
Конечно, вы можете разработать прохождение или учебник. Но большинство типов игр, которые мы создаем, взаимодействуют с базой данных очень рано. Хотя вы можете поиздеваться над некоторыми деталями, храня данные пользователя в сессии (например), я обнаружил, что гораздо проще просто создать конкретную реализацию User
. Таким образом, я могу легко связать его с другими конкретными моделями, такими как системы инвентаризации и т.д.
Затем, после того как они убьют несколько первых монстров, создадут свое первое королевство или выполнят первый квест, сообщите им, что они должны зарегистрироваться, чтобы сохранить свой прогресс! Игроки, которые собираются остаться, с радостью зарегистрируются, а те, кому не нравится ваша игра, отпадут.
Некоторые маркетинговые преимущества такой системы:
- Вы получаете гораздо более низкий показатель отказов на главной странице.
- Вы получаете возможность четко и конкретно разработать процесс регистрации для новых игроков.
- Вы получаете более точные данные и метрики о том, сколько игроков зарегистрировалось или где именно они застряли в игре.
Итак, давайте рассмотрим, как я создавал функциональность анонимного пользователя для Trounced (новая браузерная игра в жанре «королевство-строитель») на Laravel.
1. Обновите миграции
Таблица users
, которая поставляется с новой установкой Laravel, требует, чтобы у вас были заполнены поля имени и пароля. Мы обновим их, чтобы они могли быть обнуляемыми.
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->nullable()->unique();
$table->string('password')->nullable();
// Your other table fields here...
});
В результате вы теперь можете создавать пользователей вообще без электронной почты и пароля.
Отлично!
2. Создание контроллера гостевого входа
Я создал новый контроллер для обработки всей логики работы с гостями в одном месте. Первый метод, который мы добавим, — это гостевой вход одним щелчком мыши. Позже мы добавим к нему метод регистрации.
class GuestLoginController extends Controller
{
public function login(): RedirectResponse
{
$randomNumbers = rand(pow(10, 5 - 1), pow(10, 5) - 1);
$guest = User::create([
'name' => "Guest{$randomNumbers}",
]);
Auth::loginUsingId($guest->id);
return redirect()->whereverYouWant();
}
}
Это позволит вам создать нового пользователя со случайным 5-значным номером после имени ‘Guest’. Помните, что нам не нужны никакие другие поля для создания корректного пользователя.
Теперь подключите этот маршрут к кнопке на главной странице. Я бы также рекомендовал поместить его за каким-нибудь ограничителем скорости, чтобы не допустить злоупотреблений со стороны недобросовестных пользователей.
// app/Providers/RouteServiceProvider.php
RateLimiter::for('guest-registration', function (Request $request) {
return Limit::perMinute(2)->by($request->ip());
});
// routes/web.php
Route::post('/guest-login', [GuestLoginController::class, 'login'])
->middleware(['throttle:guest-registration']);
3. Взаимодействие с «гостевыми» пользователями
В какой-то момент мы захотим побудить наших гостей зарегистрироваться, но пока мы будем взаимодействовать с ними просто как с гостями.
Самый простой способ проверить, является ли пользователь гостем или нет, это посмотреть, не является ли его email
null
.
Я решил поместить это как атрибут в модель User, чтобы легко определить, является ли пользователь гостем:
// User Model
public function isGuest(): Attribute
{
return new Attribute(
get: fn ($v, $attr) => $attr['email'] === null,
);
}
Теперь вы можете ограничить любую функциональность, которую хотите скрыть от гостевых пользователей.
На моем front-end я скрываю части пользовательского интерфейса или показываю различные сообщения для гостевых пользователей в зависимости от атрибута isGuest
, который я передаю front-end.
На бэкенде я устанавливаю специальные проверки, чтобы отказать гостевым пользователям в использовании определенных функций.
Теперь реализация этого очень проста и полностью зависит от вас.
4. Поощрение регистрации
Я склоняюсь к чрезмерной коммуникабельности с гостевыми пользователями (читай: назойливости).
Я размещаю на каждой странице игры большой жирный баннер яркого цвета, который гласит: «Вы сейчас играете под учетной записью гостя. Нажмите здесь, чтобы сохранить свой прогресс!». При нажатии на баннер они попадают на страницу регистрации.
Вы можете быть более деликатными или предложить гостям зарегистрироваться после первого инструктажа.
В этом случае вам, возможно, захочется подробнее рассмотреть маркетинговую сторону вопроса. Хотите ли вы, чтобы гости превращались в пользователей несмотря ни на что? Предпочитаете ли вы отговаривать игроков от регистрации, пока они не достигнут определенного этапа игры? Это зависит только от вас.
5. Регистрация гостей
Вместо того чтобы создавать нового пользователя, мы просто хотим преобразовать существующий гостевой аккаунт игрока в полноценный аккаунт, указав его имя, электронную почту и пароль.
В Trounced, нажав на кнопку назойливый постоянный баннер переводит гостя на страницу регистрации, где мы собираем у него именно эту информацию через форму.
На задней стороне я проверяю этот запрос и обновляю пользователя-гостя. При желании вы даже можете добавить сюда дополнительные вознаграждения, чтобы побудить гостей зарегистрировать свой аккаунт.
// GuestLoginController
public function store(StoreGuestRequest $request): RedirectResponse
{
Auth::user()->name = $request->get('name');
Auth::user()->email = $request->get('email');
Auth::user()->password = Hash::make($request->get('password'));
Auth::user()->save();
return redirect()->backToTheGame();
}
Затем в моем StoreGuestRequest
я убеждаюсь, что получаю всю необходимую информацию и разрешаю гостям обращаться только к этой конечной точке.
class StoreGuestRequest extends FormRequest
{
public function authorize()
{
return Auth::user()->isGuest;
}
public function rules()
{
return [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore(Auth::id())],
'password' => ['required', 'string', new Password, 'confirmed'],
];
}
}
Теперь, когда у вашего пользователя есть действительный email, атрибут isGuest
всегда будет возвращать false
, и ваша игра будет работать как обычно. Полный круг!
6. Очистка старых гостевых аккаунтов
Если кто-то приходит и пробует вашу игру, но она ему не подходит, вы, возможно, не захотите, чтобы пользователь Guest69420
навсегда остался в вашей базе данных.
В этом случае мы сделаем модель User
обрезаемой, что является встроенным в Laravel способом очистки старых моделей.
Мы добавим признак Prunable
к модели User
, а затем определим новый метод prunable
для определения соответствующих критериев. Посмотрите документацию здесь, там описана вся настройка.
В моем случае, все модели User
, которые все еще имеют null
email и были созданы 3 или более дней назад, должны быть удалены. Не стесняйтесь менять критерии, но помните, что как только пользователь теряет аутентификацию (например, истекает срок сессии) в вашей системе, нет способа повторно аутентифицировать его, поскольку нет информации для входа!
// User Model
public function prunable()
{
return static::whereNull('email')
->where('created_at', '<', now()->subDays(3));
}
Теперь в нашем app/Console/Kernel.php
мы зарегистрируем команду для регулярного обрезания модели:
protected function schedule(Schedule $schedule)
{
$schedule->command('model:prune', [
'--model' => [User::class],
])->daily();
}
Не забудьте также очистить все связанные модели (например, инвентаризации), чтобы у вас не было бесполезных данных, плавающих в эфире. Обычно это лучше всего делать в обозревателе, что выходит за рамки данной статьи.
Теперь старые пользователи Guest автоматически очищаются и выбрасываются из базы данных.
Вот и все, друзья!
Как и во всем, что касается программирования, я уверен, что есть другие (лучшие) способы реализовать этот же тип функциональности. Мне же нужен был простой способ быстро привлечь игроков в игру, не зацикливаясь на форме регистрации.
Эта часть логики делает именно это, и она не вмешивается в другие области моего приложения и не требует от меня написания большого количества абстрактной условной логики.
Надеюсь, она поможет и вам!