Kešovanie
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-resetZá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 memoAk 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 eventsKrá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=300Do 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 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.