Registrácia a pozvánky
Registrácia má tri režimy — open, invite_only a closed (predvolený); closed odmietne aj prijatie pozvánky, preto na registráciu len cez pozvánky použite invite_only. Pozvánky sú vypnuté, kým ich nezapnete — dovtedy každé volanie invitations() vyhodí LoginMethodDisabled (404 method_disabled):
'registration' => [
'mode' => env('AUTHENTICATION_REGISTRATION', 'closed'), // open|invite_only|closed
'require_password' => true, // when login.password is on
'login_after' => true,
'rules' => null, // class-string<ProvidesRegistrationRules>|null
'creator' => CreateAccount::class, // class-string<CreatesAccounts>
],
'invitations' => [
'enabled' => false,
'ttl' => 604_800, // 7 days
'lock_email' => true,
'replace_pending' => true,
'allow_existing_email' => false,
'resend_cooldown' => 60,
'max_sends' => 5,
'preview_payload_keys' => [], // payload keys exposed by the preview endpoint
'ability' => 'authentication.invitations.manage', // Gate ability for management routes
],Registrácia
use RoundlyConsulting\Auth\DataTransferObjects\RegistrationData;
use RoundlyConsulting\Auth\Enums\RegistrationStatus;
use RoundlyConsulting\Auth\Facades\Authentication;
use RoundlyConsulting\Auth\Http\Responses\LoginResponse;
$guard = Authentication::guard('users');
$result = $guard->register(new RegistrationData(
email: $request->input('email'),
password: $request->input('password'),
context: $guard->contextFrom($request),
attributes: $request->input('attributes', []),
));
if ($result->status === RegistrationStatus::Authenticated) {
return LoginResponse::make($result->login, $request); // tokens, or a challenge
}
// VerificationRequired or Accepted — answer 202, identical for new and taken addresses- closed vráti registration_closed; invite_only vráti invitation_required.
- Obmedzené podľa IP. Validuje sa e-mail, heslo (podľa pravidiel) aj vaše ďalšie atribúty — ku creatoru sa dostanú len kľúče, ktoré vaše pravidlá uvádzajú.
- Už použitá adresa: v režimoch odolných voči enumerácii (overenie povinné pre prihlásenie alebo vypnuté login_after) dostane táto adresa e-mail o existujúcom účte a volajúci presne ten istý status ako pri novom účte; inak dostane „e-mail je obsadený“.
- Spustí sa AccountRegistered; ak overenie nie je off, odíde overovací e-mail.
- Registrácia nikdy nepreskočí povinné nastavenie dvojfaktora, ani pri vypnutom two_factor.after_email_login.
- Výsledok je authenticated (prípadne výzva), verification_required (202) alebo accepted (202).
Vlastné polia a creator
registration.rules pridá do registrácie vaše vlastné polia:
use RoundlyConsulting\Auth\Contracts\ProvidesRegistrationRules;
use RoundlyConsulting\Auth\Guards\GuardConfig;
// config: 'guards' => ['users' => ['registration' => ['rules' => ProfileRules::class]]]
final class ProfileRules implements ProvidesRegistrationRules
{
public function rules(GuardConfig $guard): array
{
return ['name' => ['required', 'string', 'max:100']];
}
}registration.creator nahradí vytváranie účtu: implementujte CreatesAccounts::create(GuardConfig $guard, NewAccountData $data): Account. NewAccountData nesie e-mail, heslo, jazyk, časové pásmo, príznak emailVerified a povolené atribúty. Ten istý creator sa použije aj pri prijatí pozvánky.
Pozvánky
use RoundlyConsulting\Auth\DataTransferObjects\AcceptInvitationData;
use RoundlyConsulting\Auth\DataTransferObjects\InvitationData;
use RoundlyConsulting\Auth\Facades\Authentication;
$guard = Authentication::guard('users');
$invitations = $guard->invitations();
// Invite — payload is your own role/meta JSON, surfaced on acceptance
$link = $invitations->create(new InvitationData(
email: '[email protected]',
payload: ['role' => 'editor'],
invitedBy: $admin,
locale: 'sk',
));
$link->invitation; // the Invitation model
$link->url; // the plaintext link, returned once — mailed to the invitee unless send: false
// Accept — creates a verified account and logs it in, like register()
$result = $invitations->accept(new AcceptInvitationData(
token: $request->input('token'),
password: $request->input('password'),
context: $guard->contextFrom($request),
)); // RegistrationResult — ->login holds the tokens or a challenge- Vytvorenie normalizuje adresu, odmietne adresu existujúceho účtu (ak nie je zapnuté allow_existing_email) a pri replace_pending zruší čakajúcu pozvánku pre adresu.
- Každé odoslanie vydá nový token, takže predošlý odkaz zanikne; resend() vráti nový InvitationLink a rešpektuje resend_cooldown a max_sends.
- send: false pozvánku vytvorí a vráti jej odkaz bez odoslania e-mailu — $link->url doručíte sami. link() vytvorí nový odkaz na skopírovanie bez e-mailu; predošlý odkaz, aj ten odoslaný, zanikne. Ani jedno sa nepočíta ako odoslanie: send_count, last_sent_at, pauza pred ďalším odoslaním, max_sends aj InvitationSent sledujú len skutočne odoslané e-maily.
- Náhľad vráti čakajúcu pozvánku — email, guard, expires_at a len kľúče z preview_payload_keys.
- Prijatie pozvánku atomicky uplatní, vytvorí overený účet (pri vypnutom lock_email sa iná adresa uloží neoverená a dostane overovací e-mail), spustí AccountRegistered a InvitationAccepted a potom prihlási.
- Stav sa odvodzuje: pending, accepted, revoked alebo expired.
Správa pozvánok
use RoundlyConsulting\Auth\DataTransferObjects\InvitationData;
use RoundlyConsulting\Auth\Enums\InvitationStatus;
use RoundlyConsulting\Auth\Events\InvitationAccepted;
use RoundlyConsulting\Auth\Facades\Authentication;
$invitations = Authentication::guard('users')->invitations();
$invitations->paginate(InvitationStatus::Pending, 20); // newest first
$invitations->find($id); // ?Invitation of this guard
$invitations->resend($invitation); // InvitationLink — mails a fresh link; the previous one dies
$invitations->link($invitation); // a fresh copyable link, nothing mailed or counted
$invitations->revoke($invitation); // idempotent
// Create without mailing — deliver $link->url yourself (no send is counted)
$link = $invitations->create(new InvitationData('[email protected]', send: false));
Invitation::query()->where('guard', 'users')->withStatus(InvitationStatus::Pending)->get();
Event::listen(fn (InvitationAccepted $e) => $e->account->assignRole($e->invitation->payloadValue('role')));Pozvánka iného guardu — ako model aj ako id — je InvitationNotFound a nový odkaz dostane len čakajúca pozvánka. Cez HTTP POST invitations odpovie 201 s data a odkazom v url (zobrazí sa raz, či už bol odoslaný, alebo nie) a resend odpovie {"status": "sent", "url": …}. Routy správy (skupina invitations.manage) vyžadujú routes.invitations_management a Gate ability z invitations.ability. Roly priraďte v listeneri InvitationAccepted podľa $invitation->payload.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.