Пакет Laravel Invite Only керує запрошеннями користувачів у Laravel-додатках. Автор — Shavonn Brown. Пакет реалізує запрошення на основі токенів із поліморфними зв’язками, автоматичними нагадуваннями та подієвими сповіщеннями.
Сценарії використання
Підходить для додатків, яким потрібне керування запрошеннями зі стеженням статусу та подальшими діями. Типові випадки: інструменти командної роботи, SaaS з організаційними членствами, платформи співпраці над проєктами, системи подій з RSVP та освітні платформи. Поліморфний дизайн дозволяє одному механізму обробляти запрошення для команд, проєктів, організацій чи будь-якої іншої моделі.
Основні можливості
Laravel Invite Only пропонує інструменти для керування запрошеннями:
- Polymorphic invitations — працюють із будь‑якою моделлю вашого додатка
- Bulk invitation support — масові запрошення з обробкою часткових помилок
- Secure token-based links — безпечні посилання на основі токенів
- Status tracking — відстеження станів pending, accepted, declined, expired та cancelled
- Automatic reminder emails — автоматичні нагадування через планувальник
- Event system — події для всіх змін життєвого циклу запрошення
- Structured exceptions — структуровані виключення з кодами помилок для налагодження
Початок роботи
Потрібні PHP 8.2+ та Laravel 11.0 або 12.0. Встановіть пакет через Composer:
composer require offload-project/laravel-invite-only
Опублікуйте конфіг та міграції:
php artisan vendor:publish --tag="invite-only-config"
php artisan vendor:publish --tag="invite-only-migrations"
php artisan migrate
Додайте необхідні трейти HasInvitations та CanBeInvited до своїх моделей:
use OffloadProject\InviteOnly\Traits\HasInvitations;
class Event extends Model
{
use HasInvitations;
}
use OffloadProject\InviteOnly\Traits\CanBeInvited;
class User extends Authenticatable
{
use CanBeInvited;
}
Надсилання запрошень
Підтримуються одиничні та масові запрошення. Для одиночного:
$event->invite('user@example.com', [
'role' => 'vip',
'invited_by' => auth()->user(),
]);
Масові запрошення з обробкою часткових помилок:
$result = $event->inviteMany(
['eric@example.com', 'paul@example.com', 'harris@example.com'],
['role' => 'vip', 'invited_by' => auth()->user()]
);
// Access successful invitations
$result->successful;
// Check failed invitations with reasons
$result->failed;
Обробка прийняття запрошення
Пакет генерує події на кожному етапі життєвого циклу запрошення. Слухайте подію InvitationAccepted, щоб виконати дії після прийняття:
use OffloadProject\InviteOnly\Events\InvitationAccepted;
Event::listen(InvitationAccepted::class, function ($event) {
$conferenceEvent = $event->invitation->invitable;
$user = $event->user;
$role = $event->invitation->role;
$conferenceEvent->attendees()->attach($user->id, ['role' => $role]);
});
Інші події: InvitationCreated, InvitationDeclined, InvitationCancelled та InvitationExpired.
Автоматичні нагадування
Налаштуйте автоматичні нагадування для відправки follow‑up листів щодо очікуваних запрошень. У конфігурації вказують, на які дні відправляти нагадування:
'reminders' => [
'after_days' => [3, 5], // Send reminders on day 3 and day 5
'max_reminders' => 2,
],
Заплануйте команду у routes/console.php:
use Illuminate\Support\Facades\Schedule;
Schedule::command('invite-only:send-reminders --mark-expired')->daily();
Система відстежує лічильник нагадувань, щоб уникати дублювання, навіть якщо планувальник пропустив день. Запрошення можна налаштувати на автоматичне завершення через вказану кількість днів (за замовчуванням 7), а команда з прапорцем --mark-expired позначить прострочені запрошення.
Поліморфні зв’язки
Сильна сторона пакета — поліморфний дизайн. Можна прив’язувати запрошення до будь‑якої моделі:
// Conference event invitations
$conferenceEvent->invite('speaker@example.com');
// Workshop invitations
$workshop->invite('attendee@example.com');
// Meetup invitations
$meetup->invite('participant@example.com');
Це зручно для додатків із різними типами сутностей, яким потрібна система запрошень.
Користувацькі метадані
Зберігайте додаткову інформацію в колонці metadata:
$event->invite('speaker@example.com', [
'metadata' => [
'session_topic' => 'Laravel AI SDK',
'time_slot' => '2:00 PM',
'dietary_restrictions' => 'vegetarian',
],
]);
// Retrieve metadata later
$invitation->metadata['session_topic']; // 'Laravel Performance'
Це дозволяє додавати довільні дані без зміни схеми БД.
Обробка помилок
Пакет повертає структуровані виключення з машинозчитуваними кодами помилок:
try {
InviteOnly::accept($token);
} catch (InvitationException $e) {
// Human-readable message
$e->getMessage(); // "This invitation has expired."
// Suggested resolution
$e->resolution; // "Create a new invitation..."
// Machine-readable code
$e->errorCode; // "INVITATION_EXPIRED"
}
Це полегшує побудову API та надання зрозумілих повідомлень користувачам.
Щоб дізнатися більше й переглянути код, відвідайте репозиторій на GitHub.