NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

Balík drží katalóg oprávnení v cache — iba id a name — aby bola kontrola cez Gate lacná. Invaliduje sa automaticky pri každej zmene priradení a pri každom uložení či zmazaní roly alebo oprávnenia, hneď ako sa daný zápis potvrdí, takže ručne ho vyprázdňujete len zriedka. Ak je to potrebné:

use RoundlyConsulting\Permissions\Facades\Permissions;

Permissions::cache()->forget();

Alebo z príkazového riadka:

php artisan permissions:cache-reset

Zápisy v transakcii

Invalidácia sa riadi potvrdením transakcie, nie samotným zápisom. V transakcii — v seederi alebo v migrácii na Postgrese — sa zdieľaná cache vyprázdni až po potvrdení najvonkajšej transakcie, takže súbežný request si medzitým nemôže znovu uložiť starý katalóg. Dovtedy proces, ktorý zapisuje, číta katalóg priamo z databázy, takže vidí vlastné zmeny, a po rollbacku v cache nezostane nič.

Katalóg cez fasádu

Permissions::permissions() a Permissions::exists() čítajú katalóg z cache; Permissions::cache() vráti malý handle na invalidáciu:

use RoundlyConsulting\Permissions\Facades\Permissions;

Permissions::permissions();               // cached catalog — Collection<Permission> (id + name)
Permissions::exists('auth.users.view');   // bool — string or BackedEnum, from the cache
Permissions::cache()->forget();           // drop the shared cache entry and this process's memo
Permissions::cache()->flushMemo();        // drop only this process's memo

Ak potrebujete celý riadok vrátane popisu, použite Permissions::findPermission().

Hromadné zápisy obchádzajú invalidáciu

Automatickú invalidáciu spúšťajú Eloquent model eventy, ktoré hromadné operácie nevyvolajú: Permission::query()->delete(), ::insert(), ::upsert(), DB::table('permissions')->… ani truncate(). Po takomto seedovaní či importe invalidujte cache výslovne. Ak forget() zavoláte v transakcii, vyprázdni cache hneď a znova po jej potvrdení. Permissions::syncFrom() zapisuje cez modely, takže vyprázdnenie nepotrebuje:

use Illuminate\Support\Facades\DB;
use RoundlyConsulting\Permissions\Facades\Permissions;

DB::table('permissions')->insert([
    ['name' => 'reports.export', 'created_at' => now(), 'updated_at' => now()],
    ['name' => 'reports.schedule', 'created_at' => now(), 'updated_at' => now()],
]);

Permissions::cache()->forget(); // mass writes fire no model events

Krátke predvolené cache.ttl (300 sekúnd) ohraničuje, ako dlho môže pretrvať vynechaná invalidácia — alebo katalóg, ktorý request práve načítaval v okamihu potvrdenia transakcie. Dlhšie TTL použite, len ak všetky zápisy idú cez Eloquent.

Octane a queue workery

Balík si nad zdieľaným cache úložiskom drží malé memo v rámci requestu a resetuje ho pri každom requeste, úlohe a ticku v Octane a na začiatku každého jobu vo fronte, takže dlho bežiaci worker nikdy nepoužije neaktuálne memo. Na ďalších hraniciach vlastného dlho bežiaceho workera zavolajte Permissions::cache()->flushMemo(). Aby sa invalidácia prejavila naprieč workermi, použite zdieľané úložisko — redis, database alebo memcached; úložisko array je lokálne pre každý worker a vyprázdnenie v inom workeri nevidí:

PERMISSIONS_CACHE_STORE=redis
PERMISSIONS_CACHE_TTL=300

Do cache sa zapisujú iba skalárne hodnoty — nikdy Eloquent modely — takže katalóg funguje aj tam, kde aplikácia obmedzuje, ktoré triedy smie cache deserializovať. Obsah v neočakávanom tvare sa namiesto chyby requestu znovu zostaví.

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 kryptomien

Odoslaní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.