Stores de cache personnalisés et contrats pour les packages
Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d’enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.
Écouter la pageenviron 10 min
Pour fournir un backend de cache propre depuis un package, séparez le Store qui implémente le stockage du Repository qui expose l’API de Laravel. Ce que vous enregistrez avec Cache::extend() est une méthode de création : Laravel n’enveloppe pas automatiquement le Store retourné dans un Repository.Cette page a été vérifiée sur l’implémentation de Laravel Framework v13.39.0. Pour les opérations de base, consultez Cache, et pour préparer le provider, consultez Développement de packages.
La configuration définie dans cache.stores et l’identifiant du Repository généré
Store
Illuminate\Cache\ArrayStore
Stockage, lecture et gestion de l’expiration des clés
Repository
Illuminate\Cache\Repository
remember(), conversion du TTL, événements de cache, etc.
CacheManager::build() appelle la création personnalisée correspondant au driver de la configuration, si elle existe, avant les drivers intégrés. Ne réutilisez pas des noms comme redis ou array : utilisez un nom propre au package.
Si un autre package utilise le cache dans son boot(), enregistrer votre driver dans votre propre boot() peut arriver trop tard selon l’ordre de chargement. Conformément à la documentation officielle, enregistrez dans register() un callback booting de l’application.L’exemple minimal suivant utilise l’ArrayStore standard afin de vérifier le chemin d’enregistrement sans service externe. Placez-le dans src/MemoServiceProvider.php du package Acme\Memo.
<?phpnamespace Acme\Memo;use Illuminate\Cache\ArrayStore;use Illuminate\Cache\Repository;use Illuminate\Contracts\Foundation\Application;use Illuminate\Support\ServiceProvider;class MemoServiceProvider extends ServiceProvider{ public function register(): void { $this->app->booting(static function (Application $app): void { $app['cache']->extend('acme-memory', static function ( Application $app, array $config, ): Repository { $store = new ArrayStore( $config['serialize'] ?? false, $app['config']->get('cache.serializable_classes'), ); return $app['cache']->repository($store, $config); }); }); }}
Chargez le provider, par exemple via la découverte automatique des packages. Ce provider, qui se contente d’enregistrer une extension, ne doit pas être différé : il doit être chargé aussi bien en HTTP qu’avec Artisan.
Le booting de l’application s’exécute, lors d’un démarrage normal, après la fin du register() de chaque provider et avant chaque boot(). Il est distinct du $this->booting() propre au provider.
Le callback de extend() reçoit l’application et le tableau de configuration du store. Placez la création du Store et les connexions externes dans ce callback de création.
Ce moment d’enregistrement ne garantit pas l’utilisation du cache dans le register() d’autres providers. Séparez l’enregistrement des services de leur utilisation effective.
Si vous avez seulement besoin du cache en mémoire standard, le driver array suffit. Cet exemple sert à expliquer l’enregistrement et les contrats ; il ne permet ni le partage entre processus ni la persistance. Pour un backend propre, remplacez la création de l’ArrayStore par une classe qui implémente Illuminate\Contracts\Cache\Store.
CacheManager::extend() relie à nouveau la portée des closures anonymes au Manager. Ne considérez pas que $this dans une closure non statique désigne le provider : utilisez, comme dans l’exemple, une closure statique et l’argument $app.
Ajoutez-le au tableau stores existant de config/cache.php. Ne concevez pas le package pour réécrire le default ou l’ensemble des stores de l’application consommatrice.
use Illuminate\Support\Facades\Cache;$value = Cache::store('catalog')->remember('product:42', 60, function () { return ['id' => 42, 'name' => 'Sample'];});
Pour en faire le store par défaut, indiquez dans CACHE_STORE le nom du store catalog, et non le nom du driver. Si vous créez plusieurs configurations avec le même driver, un Repository distinct est généré pour chaque nom de store.
CacheManager::callCustomCreator() retourne tel quel le résultat du callback. Si vous ne retournez que le Store, get() ou put() peuvent fonctionner, mais les méthodes du Repository comme remember() ne seront pas disponibles et l’interprétation du TTL changera également.Dans l’exemple, repository($store, $config) se charge de :
envelopper le Store dans un Illuminate\Cache\Repository ;
transmettre au Repository le nom store que le Manager a ajouté à la configuration ;
définir le Dispatcher sur le Repository si un Dispatcher d’événements est enregistré et que le paramètre events n’est pas désactivé.
Ce traitement n’applique pas toute votre configuration personnalisée au Store. La destination de connexion, le préfixe, la sérialisation, etc. doivent être pris en compte par l’implémentation du Store et par le code de création. C’est aussi le cas de serialize, lu depuis la configuration dans l’exemple.
Confronter le contrat Store à l’implémentation actuelle
Implémentez les méthodes exigées par Illuminate\Contracts\Cache\Store dans Laravel 13. Ne distribuez pas tels quels, comme un driver fonctionnel, des listes de méthodes vides issues d’anciens exemples.
Méthode
Comportement à vérifier
get() / many()
null pour une clé absente ou expirée. many() retourne un tableau indexé par les clés demandées, avec null pour les absentes
put() / putMany()
Stocke avec un TTL en secondes et retourne le succès ou l’échec
forever()
Stocke sans expiration. Cela n’empêche pas pour autant l’éviction ou la suppression par le backend
touch()
Modifie l’expiration d’une clé existante. Retourne false si la clé est absente ou expirée
increment() / decrement()
Retourne la valeur mise à jour ou un échec. Vérifiez aussi les mises à jour concurrentes et la conservation du TTL
forget()
Supprime la clé et retourne le résultat
flush()
Supprime tout le cache. Précisez la portée réellement supprimée
getPrefix()
Retourne le préfixe de clé utilisé par le Store
null est traité comme un défaut de cache par le Repository. Faites en sorte que false ou 0 ne soient pas considérés comme absents. Stocker null ne sert pas non plus de marqueur empêchant le recalcul dans remember().
Repository::put() traite le TTL avant de le transmettre au Store.
Appel au Repository
Traitement côté Store
put('key', $value)
forever()
put('key', $value, 60)
put() avec le nombre de secondes
put('key', $value, $expiresAt)
Conversion d’une date, etc. en secondes, puis put() si positif
put('key', $value, 0) ou TTL négatif
forget()
touch('key', 60)
touch()
touch('key', 0) ou TTL négatif
forget()
L’ArrayStore de l’exemple stocke sans expiration lorsqu’on passe directement 0 seconde à son put(). En revanche, put(..., 0) sur le Repository supprime l’élément. Tester uniquement le Store de bas niveau obtenu avec getStore() ne permet pas de vérifier le comportement de l’API appelée par les utilisateurs.
Vérifier séparément la prise en charge de add, des verrous et des tags
Implémenter le contrat Store ne garantit pas la prise en charge de toutes les fonctionnalités du cache.
add() atomique : il ne fait pas partie du contrat Store. Lorsqu’il est appelé avec un TTL positif et que le Store possède add(), le Repository l’utilise. Sinon, il se rabat sur get() et put() : envelopper le Store dans un Repository ne suffit donc pas à garantir l’atomicité. Sur un backend partagé, implémentez-le avec une opération atomique du backend et vérifiez aussi l’exécution concurrente.
Verrous : lock() et restoreLock() de Illuminate\Contracts\Cache\LockProvider relèvent d’un contrat distinct. Vérifiez l’acquisition, la correspondance du propriétaire, l’expiration et le fait de ne pas libérer le verrou d’un autre propriétaire. Les verrous de l’ArrayStore de l’exemple n’assurent pas d’exclusion mutuelle entre processus distincts.
Tags : le Repository vérifie si le Store possède tags(). Une implémentation reposant généralement sur TaggableStore ou équivalent est nécessaire ; le contrat Store seul ne les active pas automatiquement.
Ne supposez pas que flush() est une suppression partielle respectant le préfixe configuré. Vérifiez la portée de la suppression sur un backend partagé et expliquez-la aux utilisateurs, y compris pour php artisan cache:clear.
Distinguer la conservation des instances de la suppression des données
CacheManager est un singleton, et il conserve aussi le résultat de store('catalog') pour chaque nom de store. Modifier la configuration ou réenregistrer extend() ne met pas à jour un Repository déjà généré.
use Illuminate\Support\Facades\Cache;$before = Cache::store('catalog');config(['cache.stores.catalog.serialize' => false]);$same = Cache::store('catalog');Cache::forgetDriver('catalog');$after = Cache::store('catalog');
$same est le même objet que $before. C’est lors de la récupération après forgetDriver() que $after est généré à partir de la nouvelle configuration.
Opération
Cible
Cache::forgetDriver('catalog')
Retire la référence au Repository conservée par le Manager
Cache::store('catalog')->forget('key')
Supprime une clé stockée
Cache::store('catalog')->flush()
Supprime toutes les données de cache du Store
forgetDriver() ne vide pas le backend. Toutefois, comme l’ArrayStore de l’exemple conserve ses données dans l’instance, les anciennes données ne sont pas visibles depuis le nouveau Store. Par ailleurs, les références à l’ancien Repository détenues par $before côté consommateur ou par le singleton cache.store déjà résolu ne sont pas remplacées.En production, mettez à jour le cache de configuration selon votre déploiement habituel et redémarrez les workers de longue durée. Tenez aussi compte du cycle de vie des services et ne considérez pas une nouvelle résolution comme une mise à jour simultanée de tous les processus.
Tester le chemin de création, pas seulement des mocks de façade
Dans l’environnement de test du package, passez par le véritable Manager et le véritable Repository. L’exemple Testbench suivant vérifie que le driver est utilisable même dans le boot() d’un autre provider enregistré avant. Il stocke un tableau sans modifier la restriction de désérialisation cache.serializable_classes, et vérifie aussi la valeur brute stockée avec ArrayStore::all(false).
Pour un backend propre, vérifiez en plus l’expiration, les clés absentes de many(), l’aller-retour de false et 0, touch(), les pannes de connexion, les mises à jour concurrentes, ainsi que le préfixe et la portée des suppressions. Un simple succès de Cache::shouldReceive('get') ne prouve ni l’enregistrement du driver ni la compatibilité avec un service externe.
Liste de contrôle pour la maintenance à long terme
Faire du nom du driver, de la configuration du store, du format de sérialisation, des exceptions et des valeurs de retour en cas d’échec une spécification publique.
Vérifier, pour chaque version de Laravel prise en charge, les méthodes du contrat Store et les fonctionnalités optionnelles comme les tags et les verrous.
Vérifier que l’enregistrement fonctionne lors d’un nouveau démarrage avec cache de configuration, et que le driver est utilisable depuis le boot() d’autres providers.
Annoncer les changements de compatibilité des données stockées, y compris la stratégie de migration ou de suppression des clés existantes.
Distinguer la conservation des instances dans le processus, les données du backend et le cache de configuration.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Knowledge of Laravel","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146","dark":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/dark.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=a8a0340d86ff8aa90e9adfc98a0362d7","href":"/"},"favicon":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/favicon.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=8f5a03a681c95d31803fc237b5811065","api":{"playground":{"display":"simple"}},"navbar":{},"footer":{"socials":{"github":"https://github.com/invokable"}},"seo":{"metatags":{"canonical":"https://kawax.biz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"jp","default":true,"href":"jp/packages/laravel-boost-copilot-cli"},{"language":"en","href":"en/packages/laravel-boost-copilot-cli"},{"language":"de","href":"de/packages/laravel-boost-copilot-cli"},{"language":"es","href":"es/packages/laravel-boost-copilot-cli"},{"language":"fr","href":"fr/packages/laravel-boost-copilot-cli"},{"language":"it","href":"it/packages/laravel-boost-copilot-cli"},{"language":"ko","href":"ko/packages/laravel-boost-copilot-cli"},{"language":"nl","href":"nl/packages/laravel-boost-copilot-cli"},{"language":"zh-Hans","href":"zh-CN/packages/laravel-boost-copilot-cli"},{"language":"zh-Hant","href":"zh-TW/packages/laravel-boost-copilot-cli"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"invokable","hasAudioNarration":true,"actualSubdomain":"invokable","customDomains":["kawax.biz"],"gitSource":{"type":"github","owner":"kawax","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae523808263bb91dcfa76c5","collectionId":"12cba4c9-b89c-4ae9-98e7-4796cdf1a8aa","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae523808263bb91dcfa76c5"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae523808263bb91dcfa76c5","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"en","tag":"My Packages","count":145},{"language":"jp","tag":"マイパッケージ","count":145},{"language":"de","tag":"Meine Pakete","count":100},{"language":"es","tag":"Mis paquetes","count":100},{"language":"fr","tag":"Mes packages","count":100},{"language":"it","tag":"I miei pacchetti","count":100},{"language":"ko","tag":"My 패키지","count":100},{"language":"nl","tag":"Mijn packages","count":100},{"language":"zh-Hans","tag":"我的包","count":100},{"language":"zh-Hant","tag":"我的套件","count":100},{"language":"de","tag":"Fortgeschrittene Themen","count":71},{"language":"en","tag":"Advanced Topics","count":71},{"language":"es","tag":"Temas avanzados","count":71},{"language":"fr","tag":"Sujets avancés","count":71},{"language":"it","tag":"Argomenti avanzati","count":71},{"language":"jp","tag":"応用トピック","count":71},{"language":"ko","tag":"심화 주제","count":71},{"language":"nl","tag":"Geavanceerde onderwerpen","count":71},{"language":"zh-Hans","tag":"进阶主题","count":71},{"language":"zh-Hant","tag":"進階主題","count":71},{"language":"en","tag":"VOICEVOX","count":67},{"language":"jp","tag":"VOICEVOX","count":67},{"language":"de","tag":"Leitfaden","count":61},{"language":"en","tag":"Guide","count":61},{"language":"es","tag":"Guía","count":61},{"language":"fr","tag":"Guide","count":61},{"language":"it","tag":"Guida","count":61},{"language":"jp","tag":"ガイド","count":61},{"language":"ko","tag":"가이드","count":61},{"language":"nl","tag":"Gids","count":61},{"language":"zh-Hans","tag":"指南","count":61},{"language":"zh-Hant","tag":"指南","count":61},{"language":"de","tag":"Blog","count":46},{"language":"en","tag":"Blog","count":46},{"language":"es","tag":"Blog","count":46},{"language":"fr","tag":"Blog","count":46},{"language":"it","tag":"Blog","count":46},{"language":"jp","tag":"ブログ","count":46},{"language":"ko","tag":"블로그","count":46},{"language":"nl","tag":"Blog","count":46},{"language":"zh-Hans","tag":"博客","count":46},{"language":"zh-Hant","tag":"部落格","count":46},{"language":"en","tag":"VOICEVOX Engine API Reference","count":45},{"language":"jp","tag":"VOICEVOXエンジンAPIリファレンス","count":45},{"language":"de","tag":"GitHub Copilot","count":43},{"language":"en","tag":"GitHub Copilot","count":43},{"language":"es","tag":"GitHub Copilot","count":43},{"language":"fr","tag":"GitHub Copilot","count":43},{"language":"it","tag":"GitHub Copilot","count":43},{"language":"jp","tag":"GitHub Copilot","count":43},{"language":"ko","tag":"GitHub Copilot","count":43},{"language":"nl","tag":"GitHub Copilot","count":43},{"language":"zh-Hans","tag":"GitHub Copilot","count":43},{"language":"zh-Hant","tag":"GitHub Copilot","count":43},{"language":"de","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"en","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"es","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"fr","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"it","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"jp","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"ko","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"nl","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hans","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hant","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"de","tag":"Tutorial","count":35},{"language":"en","tag":"Tutorial","count":35},{"language":"es","tag":"Tutorial","count":35},{"language":"fr","tag":"Tutoriel","count":35},{"language":"it","tag":"Tutorial","count":35},{"language":"jp","tag":"チュートリアル","count":35},{"language":"ko","tag":"튜토리얼","count":35},{"language":"nl","tag":"Tutorial","count":35},{"language":"zh-Hans","tag":"教程","count":35},{"language":"zh-Hant","tag":"教學","count":35},{"language":"de","tag":"Paketentwicklung","count":33},{"language":"en","tag":"Package Development","count":33},{"language":"es","tag":"Desarrollo de paquetes","count":33},{"language":"fr","tag":"Développement de packages","count":33},{"language":"it","tag":"Sviluppo di pacchetti","count":33},{"language":"jp","tag":"パッケージ開発","count":33},{"language":"ko","tag":"패키지 개발","count":33},{"language":"nl","tag":"Package-ontwikkeling","count":33},{"language":"zh-Hans","tag":"包开发","count":33},{"language":"zh-Hant","tag":"套件開發","count":33},{"language":"de","tag":"SDK","count":27},{"language":"es","tag":"SDK","count":27},{"language":"fr","tag":"SDK","count":27},{"language":"it","tag":"SDK","count":27},{"language":"ko","tag":"SDK","count":27},{"language":"nl","tag":"SDK","count":27},{"language":"zh-Hans","tag":"SDK","count":27},{"language":"zh-Hant","tag":"SDK","count":27},{"language":"de","tag":"VOICEVOX","count":22},{"language":"es","tag":"VOICEVOX","count":22},{"language":"fr","tag":"VOICEVOX","count":22},{"language":"it","tag":"VOICEVOX","count":22},{"language":"ko","tag":"VOICEVOX","count":22},{"language":"nl","tag":"VOICEVOX","count":22},{"language":"zh-Hans","tag":"VOICEVOX","count":22},{"language":"zh-Hant","tag":"VOICEVOX","count":22}],"searchSettings":{"isFiltersEnabled":false,"showContentSnippets":true,"fullPageSearch":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"fr/advanced/package-cache-drivers","slug":"/fr/advanced/package-cache-drivers","pageMetadata":{"title":"Stores de cache personnalisés et contrats pour les packages","description":"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d'enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.","href":"/fr/advanced/package-cache-drivers"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d’enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Pour fournir un backend de cache propre depuis un package, séparez `,_jsx(_components.strong,{children:`le Store qui implémente le stockage`}),` du `,_jsx(_components.strong,{children:`Repository qui expose l’API de Laravel`}),`. Ce que vous enregistrez avec `,_jsx(_components.code,{children:`Cache::extend()`}),` est une méthode de création : Laravel n’enveloppe pas automatiquement le Store retourné dans un Repository.`]}),`\n`,_jsxs(_components.p,{children:[`Cette page a été vérifiée sur l’implémentation de Laravel Framework `,_jsx(_components.code,{children:`v13.39.0`}),`. Pour les opérations de base, consultez `,_jsx(_components.a,{href:`/fr/cache`,children:`Cache`}),`, et pour préparer le provider, consultez `,_jsx(_components.a,{href:`/fr/advanced/package-development`,children:`Développement de packages`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`distinguer-le-nom-du-driver-du-nom-du-store`,children:`Distinguer le nom du driver du nom du store`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Élément`}),_jsx(_components.th,{children:`Exemple de cette page`}),_jsx(_components.th,{children:`Rôle`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Nom du driver`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`acme-memory`})}),_jsxs(_components.td,{children:[`La méthode de création enregistrée avec `,_jsx(_components.code,{children:`extend()`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Nom du store`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`catalog`})}),_jsxs(_components.td,{children:[`La configuration définie dans `,_jsx(_components.code,{children:`cache.stores`}),` et l’identifiant du Repository généré`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Store`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Illuminate\\\\Cache\\\\ArrayStore`})}),_jsx(_components.td,{children:`Stockage, lecture et gestion de l’expiration des clés`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Repository`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Illuminate\\\\Cache\\\\Repository`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`remember()`}),`, conversion du TTL, événements de cache, etc.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`CacheManager::build()`}),` appelle la création personnalisée correspondant au `,_jsx(_components.code,{children:`driver`}),` de la configuration, si elle existe, avant les drivers intégrés. Ne réutilisez pas des noms comme `,_jsx(_components.code,{children:`redis`}),` ou `,_jsx(_components.code,{children:`array`}),` : utilisez un nom propre au package.`]}),`\n`,_jsx(Mermaid,{chart:`flowchart TD\n A[\"Cache::store('catalog')\"] --> B{\"catalog déjà résolu ?\"}\n B -->|Oui| C[\"Retourner le Repository conservé\"]\n B -->|Non| D[\"Lire cache.stores.catalog\"]\n D --> E[\"Création pour driver: acme-memory\"]\n E --> F[\"Créer le Store et\u003cbr>l'envelopper avec repository()\"]\n F --> G[\"Conserver sous le nom catalog\"]`}),`\n`,_jsx(Heading,{level:`2`,id:`enregistrer-avant-le-boot-des-autres-providers`,children:`Enregistrer avant le boot des autres providers`}),`\n`,_jsxs(_components.p,{children:[`Si un autre package utilise le cache dans son `,_jsx(_components.code,{children:`boot()`}),`, enregistrer votre driver dans votre propre `,_jsx(_components.code,{children:`boot()`}),` peut arriver trop tard selon l’ordre de chargement. Conformément à la documentation officielle, enregistrez dans `,_jsx(_components.code,{children:`register()`}),` un `,_jsxs(_components.strong,{children:[`callback `,_jsx(_components.code,{children:`booting`}),` de l’application`]}),`.`]}),`\n`,_jsxs(_components.p,{children:[`L’exemple minimal suivant utilise l’`,_jsx(_components.code,{children:`ArrayStore`}),` standard afin de vérifier le chemin d’enregistrement sans service externe. Placez-le dans `,_jsx(_components.code,{children:`src/MemoServiceProvider.php`}),` du package `,_jsx(_components.code,{children:`Acme\\\\Memo`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Acme\\\\Memo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Cache\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ArrayStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Cache\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Repository`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Contracts\\\\Foundation\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Application`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ServiceProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` MemoServiceProvider`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ServiceProvider`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` register`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`app`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`booting`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`static`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Application`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`extend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'acme-memory'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`static`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Application`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` array`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Repository`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $store`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ArrayStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'serialize'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`??`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'config'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache.serializable_classes'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`repository`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Chargez le provider, par exemple via la `,_jsx(_components.a,{href:`/fr/advanced/package-discovery`,children:`découverte automatique des packages`}),`. Ce provider, qui se contente d’enregistrer une extension, ne doit pas être différé : il doit être chargé aussi bien en HTTP qu’avec Artisan.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Le `,_jsx(_components.code,{children:`booting`}),` de l’application s’exécute, lors d’un démarrage normal, après la fin du `,_jsx(_components.code,{children:`register()`}),` de chaque provider et avant chaque `,_jsx(_components.code,{children:`boot()`}),`. Il est distinct du `,_jsx(_components.code,{children:`$this->booting()`}),` propre au provider.`]}),`\n`,_jsxs(_components.li,{children:[`Le callback de `,_jsx(_components.code,{children:`extend()`}),` reçoit l’application et le tableau de configuration du store. Placez la création du Store et les connexions externes dans ce callback de création.`]}),`\n`,_jsxs(_components.li,{children:[`Ce moment d’enregistrement ne garantit pas `,_jsxs(_components.strong,{children:[`l’utilisation du cache dans le `,_jsx(_components.code,{children:`register()`})]}),` d’autres providers. Séparez l’enregistrement des services de leur utilisation effective.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Si vous avez seulement besoin du cache en mémoire standard, le driver `,_jsx(_components.code,{children:`array`}),` suffit. Cet exemple sert à expliquer l’enregistrement et les contrats ; il ne permet ni le partage entre processus ni la persistance. Pour un backend propre, remplacez la création de l’`,_jsx(_components.code,{children:`ArrayStore`}),` par une classe qui implémente `,_jsx(_components.code,{children:`Illuminate\\\\Contracts\\\\Cache\\\\Store`}),`.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`CacheManager::extend()`}),` relie à nouveau la portée des closures anonymes au Manager. Ne considérez pas que `,_jsx(_components.code,{children:`$this`}),` dans une closure non statique désigne le provider : utilisez, comme dans l’exemple, une closure statique et l’argument `,_jsx(_components.code,{children:`$app`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`ajouter-le-store-dans-l’application-consommatrice`,children:`Ajouter le store dans l’application consommatrice`}),`\n`,_jsxs(_components.p,{children:[`Ajoutez-le au tableau `,_jsx(_components.code,{children:`stores`}),` existant de `,_jsx(_components.code,{children:`config/cache.php`}),`. Ne concevez pas le package pour réécrire le `,_jsx(_components.code,{children:`default`}),` ou l’ensemble des `,_jsx(_components.code,{children:`stores`}),` de l’application consommatrice.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'driver'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'acme-memory'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'serialize'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`remember`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'product:42'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`60`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` () {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'id'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 42`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'name'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Sample'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Pour en faire le store par défaut, indiquez dans `,_jsx(_components.code,{children:`CACHE_STORE`}),` le `,_jsxs(_components.strong,{children:[`nom du store `,_jsx(_components.code,{children:`catalog`})]}),`, et non le nom du driver. Si vous créez plusieurs configurations avec le même driver, un Repository distinct est généré pour chaque nom de store.`]}),`\n`,_jsx(Heading,{level:`2`,id:`construire-le-repository-soi-même`,children:`Construire le Repository soi-même`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`CacheManager::callCustomCreator()`}),` retourne tel quel le résultat du callback. Si vous ne retournez que le Store, `,_jsx(_components.code,{children:`get()`}),` ou `,_jsx(_components.code,{children:`put()`}),` peuvent fonctionner, mais les méthodes du Repository comme `,_jsx(_components.code,{children:`remember()`}),` ne seront pas disponibles et l’interprétation du TTL changera également.`]}),`\n`,_jsxs(_components.p,{children:[`Dans l’exemple, `,_jsx(_components.code,{children:`repository($store, $config)`}),` se charge de :`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`envelopper le Store dans un `,_jsx(_components.code,{children:`Illuminate\\\\Cache\\\\Repository`}),` ;`]}),`\n`,_jsxs(_components.li,{children:[`transmettre au Repository le nom `,_jsx(_components.code,{children:`store`}),` que le Manager a ajouté à la configuration ;`]}),`\n`,_jsxs(_components.li,{children:[`définir le Dispatcher sur le Repository si un Dispatcher d’événements est enregistré et que le paramètre `,_jsx(_components.code,{children:`events`}),` n’est pas désactivé.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Ce traitement n’applique pas toute votre configuration personnalisée au Store. La destination de connexion, le préfixe, la sérialisation, etc. doivent être pris en compte par l’implémentation du Store et par le code de création. C’est aussi le cas de `,_jsx(_components.code,{children:`serialize`}),`, lu depuis la configuration dans l’exemple.`]}),`\n`,_jsx(Heading,{level:`2`,id:`confronter-le-contrat-store-à-l’implémentation-actuelle`,children:`Confronter le contrat Store à l’implémentation actuelle`}),`\n`,_jsxs(_components.p,{children:[`Implémentez les méthodes exigées par `,_jsx(_components.code,{children:`Illuminate\\\\Contracts\\\\Cache\\\\Store`}),` dans Laravel 13. Ne distribuez pas tels quels, comme un driver fonctionnel, des listes de méthodes vides issues d’anciens exemples.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Méthode`}),_jsx(_components.th,{children:`Comportement à vérifier`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`get()`}),` / `,_jsx(_components.code,{children:`many()`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`null`}),` pour une clé absente ou expirée. `,_jsx(_components.code,{children:`many()`}),` retourne un tableau indexé par les clés demandées, avec `,_jsx(_components.code,{children:`null`}),` pour les absentes`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`put()`}),` / `,_jsx(_components.code,{children:`putMany()`})]}),_jsx(_components.td,{children:`Stocke avec un TTL en secondes et retourne le succès ou l’échec`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`forever()`})}),_jsx(_components.td,{children:`Stocke sans expiration. Cela n’empêche pas pour autant l’éviction ou la suppression par le backend`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`touch()`})}),_jsxs(_components.td,{children:[`Modifie l’expiration d’une clé existante. Retourne `,_jsx(_components.code,{children:`false`}),` si la clé est absente ou expirée`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`increment()`}),` / `,_jsx(_components.code,{children:`decrement()`})]}),_jsx(_components.td,{children:`Retourne la valeur mise à jour ou un échec. Vérifiez aussi les mises à jour concurrentes et la conservation du TTL`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`forget()`})}),_jsx(_components.td,{children:`Supprime la clé et retourne le résultat`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`flush()`})}),_jsx(_components.td,{children:`Supprime tout le cache. Précisez la portée réellement supprimée`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getPrefix()`})}),_jsx(_components.td,{children:`Retourne le préfixe de clé utilisé par le Store`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`null`}),` est traité comme un défaut de cache par le Repository. Faites en sorte que `,_jsx(_components.code,{children:`false`}),` ou `,_jsx(_components.code,{children:`0`}),` ne soient pas considérés comme absents. Stocker `,_jsx(_components.code,{children:`null`}),` ne sert pas non plus de marqueur empêchant le recalcul dans `,_jsx(_components.code,{children:`remember()`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`vérifier-le-ttl-via-le-repository`,children:`Vérifier le TTL via le Repository`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Repository::put()`}),` traite le TTL avant de le transmettre au Store.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Appel au Repository`}),_jsx(_components.th,{children:`Traitement côté Store`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`put('key', $value)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`forever()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`put('key', $value, 60)`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`put()`}),` avec le nombre de secondes`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`put('key', $value, $expiresAt)`})}),_jsxs(_components.td,{children:[`Conversion d’une date, etc. en secondes, puis `,_jsx(_components.code,{children:`put()`}),` si positif`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`put('key', $value, 0)`}),` ou TTL négatif`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`forget()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`touch('key', 60)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`touch()`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`touch('key', 0)`}),` ou TTL négatif`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`forget()`})})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`L’`,_jsx(_components.code,{children:`ArrayStore`}),` de l’exemple stocke sans expiration lorsqu’on passe directement `,_jsx(_components.code,{children:`0`}),` seconde à son `,_jsx(_components.code,{children:`put()`}),`. En revanche, `,_jsx(_components.code,{children:`put(..., 0)`}),` sur le Repository supprime l’élément. Tester uniquement le Store de bas niveau obtenu avec `,_jsx(_components.code,{children:`getStore()`}),` ne permet pas de vérifier le comportement de l’API appelée par les utilisateurs.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`vérifier-séparément-la-prise-en-charge-de-add-des-verrous-et-des-tags`,children:`Vérifier séparément la prise en charge de add, des verrous et des tags`}),`\n`,_jsx(_components.p,{children:`Implémenter le contrat Store ne garantit pas la prise en charge de toutes les fonctionnalités du cache.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`add()`}),` atomique`]}),` : il ne fait pas partie du contrat Store. Lorsqu’il est appelé avec un TTL positif et que le Store possède `,_jsx(_components.code,{children:`add()`}),`, le Repository l’utilise. Sinon, il se rabat sur `,_jsx(_components.code,{children:`get()`}),` et `,_jsx(_components.code,{children:`put()`}),` : envelopper le Store dans un Repository ne suffit donc pas à garantir l’atomicité. Sur un backend partagé, implémentez-le avec une opération atomique du backend et vérifiez aussi l’exécution concurrente.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Verrous`}),` : `,_jsx(_components.code,{children:`lock()`}),` et `,_jsx(_components.code,{children:`restoreLock()`}),` de `,_jsx(_components.code,{children:`Illuminate\\\\Contracts\\\\Cache\\\\LockProvider`}),` relèvent d’un contrat distinct. Vérifiez l’acquisition, la correspondance du propriétaire, l’expiration et le fait de ne pas libérer le verrou d’un autre propriétaire. Les verrous de l’`,_jsx(_components.code,{children:`ArrayStore`}),` de l’exemple n’assurent pas d’exclusion mutuelle entre processus distincts.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Tags`}),` : le Repository vérifie si le Store possède `,_jsx(_components.code,{children:`tags()`}),`. Une implémentation reposant généralement sur `,_jsx(_components.code,{children:`TaggableStore`}),` ou équivalent est nécessaire ; le contrat Store seul ne les active pas automatiquement.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Ne supposez pas que `,_jsx(_components.code,{children:`flush()`}),` est une suppression partielle respectant le préfixe configuré. Vérifiez la portée de la suppression sur un backend partagé et expliquez-la aux utilisateurs, y compris pour `,_jsx(_components.code,{children:`php artisan cache:clear`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`distinguer-la-conservation-des-instances-de-la-suppression-des-données`,children:`Distinguer la conservation des instances de la suppression des données`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`CacheManager`}),` est un singleton, et il conserve aussi le résultat de `,_jsx(_components.code,{children:`store('catalog')`}),` pour chaque nom de store. Modifier la configuration ou réenregistrer `,_jsx(_components.code,{children:`extend()`}),` ne met pas à jour un Repository déjà généré.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$before`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`([`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache.stores.catalog.serialize'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$same`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`forgetDriver`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`$same`}),` est le même objet que `,_jsx(_components.code,{children:`$before`}),`. C’est lors de la récupération après `,_jsx(_components.code,{children:`forgetDriver()`}),` que `,_jsx(_components.code,{children:`$after`}),` est généré à partir de la nouvelle configuration.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Opération`}),_jsx(_components.th,{children:`Cible`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Cache::forgetDriver('catalog')`})}),_jsx(_components.td,{children:`Retire la référence au Repository conservée par le Manager`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Cache::store('catalog')->forget('key')`})}),_jsx(_components.td,{children:`Supprime une clé stockée`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Cache::store('catalog')->flush()`})}),_jsx(_components.td,{children:`Supprime toutes les données de cache du Store`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`forgetDriver()`}),` ne vide pas le backend. Toutefois, comme l’`,_jsx(_components.code,{children:`ArrayStore`}),` de l’exemple conserve ses données dans l’instance, les anciennes données ne sont pas visibles depuis le nouveau Store. Par ailleurs, les références à l’ancien Repository détenues par `,_jsx(_components.code,{children:`$before`}),` côté consommateur ou par le singleton `,_jsx(_components.code,{children:`cache.store`}),` déjà résolu ne sont pas remplacées.`]}),`\n`,_jsxs(_components.p,{children:[`En production, mettez à jour le cache de configuration selon votre déploiement habituel et redémarrez les workers de longue durée. Tenez aussi compte du `,_jsx(_components.a,{href:`/fr/advanced/package-service-lifetimes`,children:`cycle de vie des services`}),` et ne considérez pas une nouvelle résolution comme une mise à jour simultanée de tous les processus.`]}),`\n`,_jsx(Heading,{level:`2`,id:`tester-le-chemin-de-création-pas-seulement-des-mocks-de-façade`,children:`Tester le chemin de création, pas seulement des mocks de façade`}),`\n`,_jsxs(_components.p,{children:[`Dans l’`,_jsx(_components.a,{href:`/fr/advanced/package-testing`,children:`environnement de test du package`}),`, passez par le véritable Manager et le véritable Repository. L’exemple Testbench suivant vérifie que le driver est utilisable même dans le `,_jsx(_components.code,{children:`boot()`}),` d’un autre provider enregistré avant. Il stocke un tableau sans modifier la restriction de désérialisation `,_jsx(_components.code,{children:`cache.serializable_classes`}),`, et vérifie aussi la valeur brute stockée avec `,_jsx(_components.code,{children:`ArrayStore::all(false)`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`87`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`87`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Acme\\\\Memo\\\\Tests`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Acme\\\\Memo\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`MemoServiceProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Cache\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ArrayStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Cache\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Repository`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ServiceProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Orchestra\\\\Testbench\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`TestCase`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` CacheConsumerProvider`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ServiceProvider`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` boot`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`forever`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'boot-marker'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'ready'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` PackageCacheTest`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` TestCase`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` protected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` getPackageProviders`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` array`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`CacheConsumerProvider`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`MemoServiceProvider`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` protected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` defineEnvironment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'config'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`set`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache.default'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'array'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'config'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`set`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache.stores.catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'driver'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'acme-memory'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'serialize'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]);`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_the_driver_is_available_during_another_providers_boot`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertInstanceOf`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Repository`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertInstanceOf`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ArrayStore`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getName`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'ready'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'boot-marker'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertNotNull`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getEventDispatcher`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_serialization_is_applied_from_the_store_configuration`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $value`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'status'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'queued'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`put`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'job'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`60`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'job'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`serialize`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`all`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'job'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'value'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_a_zero_ttl_deletes_the_item_through_the_repository`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`forever`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'product:42'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'old'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertTrue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`put`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'product:42'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'new'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertNull`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'product:42'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_forgetting_a_driver_rebuilds_only_the_manager_reference`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $before`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`([`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'cache.stores.catalog.serialize'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$before`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`forgetDriver`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Cache`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`store`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'catalog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertNotSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$before`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$after`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'ready'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$before`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'boot-marker'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertNull`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'boot-marker'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $value`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'status'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'queued'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`forever`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'job'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'job'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertSame`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$value`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`all`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'job'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'value'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Pour un backend propre, vérifiez en plus l’expiration, les clés absentes de `,_jsx(_components.code,{children:`many()`}),`, l’aller-retour de `,_jsx(_components.code,{children:`false`}),` et `,_jsx(_components.code,{children:`0`}),`, `,_jsx(_components.code,{children:`touch()`}),`, les pannes de connexion, les mises à jour concurrentes, ainsi que le préfixe et la portée des suppressions. Un simple succès de `,_jsx(_components.code,{children:`Cache::shouldReceive('get')`}),` ne prouve ni l’enregistrement du driver ni la compatibilité avec un service externe.`]}),`\n`,_jsx(Heading,{level:`2`,id:`liste-de-contrôle-pour-la-maintenance-à-long-terme`,children:`Liste de contrôle pour la maintenance à long terme`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Faire du nom du driver, de la configuration du store, du format de sérialisation, des exceptions et des valeurs de retour en cas d’échec une spécification publique.`}),`\n`,_jsx(_components.li,{children:`Vérifier, pour chaque version de Laravel prise en charge, les méthodes du contrat Store et les fonctionnalités optionnelles comme les tags et les verrous.`}),`\n`,_jsxs(_components.li,{children:[`Vérifier que l’enregistrement fonctionne lors d’un nouveau démarrage avec cache de configuration, et que le driver est utilisable depuis le `,_jsx(_components.code,{children:`boot()`}),` d’autres providers.`]}),`\n`,_jsx(_components.li,{children:`Annoncer les changements de compatibilité des données stockées, y compris la stratégie de migration ou de suppression des clés existantes.`}),`\n`,_jsx(_components.li,{children:`Distinguer la conservation des instances dans le processus, les données du backend et le cache de configuration.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`sources-primaires-consultées`,children:`Sources primaires consultées`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/docs/blob/960eedf0911155ad16326ade49c0ea5d18eda0b8/cache.md#adding-custom-cache-drivers`,children:`Documentation officielle de Laravel : drivers de cache personnalisés`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Cache/CacheManager.php`,children:`CacheManager : build, repository, extend, forgetDriver`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Cache/Repository.php`,children:`Repository : conversion du TTL, add, tags, événements`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Contracts/Cache/Store.php`,children:`Contrat Store`}),` / `,_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Contracts/Cache/LockProvider.php`,children:`Contrat LockProvider`})]}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Cache/ArrayStore.php`,children:`ArrayStore : stockage, expiration, sérialisation`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Cache/CacheServiceProvider.php`,children:`CacheServiceProvider : enregistrement singleton du Manager et de cache.store`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/src/Illuminate/Foundation/Application.php`,children:`Application : booting de l’application et boot des providers`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/tests/Cache/CacheManagerTest.php`,children:`Tests officiels de Laravel : CacheManagerTest`}),` / `,_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.39.0/tests/Cache/CacheRepositoryTest.php`,children:`CacheRepositoryTest`})]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Stores de cache personnalisés et contrats pour les packages","description":"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d'enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.","href":"/fr/advanced/package-cache-drivers"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Distinguer le nom du driver du nom du store","slug":"distinguer-le-nom-du-driver-du-nom-du-store","depth":2,"children":[]},{"title":"Enregistrer avant le boot des autres providers","slug":"enregistrer-avant-le-boot-des-autres-providers","depth":2,"children":[{"title":"Ajouter le store dans l’application consommatrice","slug":"ajouter-le-store-dans-l’application-consommatrice","depth":3,"children":[]}]},{"title":"Construire le Repository soi-même","slug":"construire-le-repository-soi-même","depth":2,"children":[]},{"title":"Confronter le contrat Store à l’implémentation actuelle","slug":"confronter-le-contrat-store-à-l’implémentation-actuelle","depth":2,"children":[{"title":"Vérifier le TTL via le Repository","slug":"vérifier-le-ttl-via-le-repository","depth":3,"children":[]},{"title":"Vérifier séparément la prise en charge de add, des verrous et des tags","slug":"vérifier-séparément-la-prise-en-charge-de-add-des-verrous-et-des-tags","depth":3,"children":[]}]},{"title":"Distinguer la conservation des instances de la suppression des données","slug":"distinguer-la-conservation-des-instances-de-la-suppression-des-données","depth":2,"children":[]},{"title":"Tester le chemin de création, pas seulement des mocks de façade","slug":"tester-le-chemin-de-création-pas-seulement-des-mocks-de-façade","depth":2,"children":[]},{"title":"Liste de contrôle pour la maintenance à long terme","slug":"liste-de-contrôle-pour-la-maintenance-à-long-terme","depth":2,"children":[]},{"title":"Sources primaires consultées","slug":"sources-primaires-consultées","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"narration":{"path":"fr/advanced/package-cache-drivers","locale":"fr","estimatedDurationSec":577},"subdomain":"invokable","siteName":"Knowledge of Laravel","title":"Stores de cache personnalisés et contrats pour les packages - Knowledge of Laravel","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"jp":{"href":"/jp/advanced/package-cache-drivers","matchLevel":1},"en":{"href":"/en/advanced/package-cache-drivers","matchLevel":1},"de":{"href":"/de/advanced/package-cache-drivers","matchLevel":1},"es":{"href":"/es/advanced/package-cache-drivers","matchLevel":1},"fr":{"href":"/fr/advanced/package-cache-drivers","matchLevel":0},"it":{"href":"/it/advanced/package-cache-drivers","matchLevel":1},"ko":{"href":"/ko/advanced/package-cache-drivers","matchLevel":1},"nl":{"href":"/nl/advanced/package-cache-drivers","matchLevel":1},"zh-Hans":{"href":"/zh-CN/advanced/package-cache-drivers","matchLevel":1},"zh-Hant":{"href":"/zh-TW/advanced/package-cache-drivers","matchLevel":1}}},"lastModified":"2026-10-29T21:18:32.797Z","gitLastModified":"2026-10-29T21:17:56.000Z","originalFileLocation":"fr/advanced/package-cache-drivers.mdx","locale":"fr"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d\u0026#x27;enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Stores de cache personnalisés et contrats pour les packages - Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:description\" content=\"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d\u0026#x27;enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://kawax.biz/fr/advanced/package-cache-drivers\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://invokable.mintlify.app/_mintlify/api/og/v2?division=D%C3%A9veloppement+de+packages\u0026amp;title=Stores+de+cache+personnalis%C3%A9s+et+contrats+pour+les+packages\u0026amp;description=Analysez+le+CacheManager+et+le+contrat+Store+de+Laravel+13+pour+v%C3%A9rifier+le+moment+d%27enregistrement+du+driver%2C+la+conversion+du+TTL+par+le+Repository%2C+la+conser\u0026amp;theme=e73cb59538246989d21d6ff5\u0026amp;signature=45a086f27d92f79e1ddb73dabb1ed8b47081396ebd0704ae93b68708d6c98569\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Stores de cache personnalisés et contrats pour les packages - Knowledge of Laravel\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d\u0026#x27;enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://invokable.mintlify.app/_mintlify/api/og/v2?division=D%C3%A9veloppement+de+packages\u0026amp;title=Stores+de+cache+personnalis%C3%A9s+et+contrats+pour+les+packages\u0026amp;description=Analysez+le+CacheManager+et+le+contrat+Store+de+Laravel+13+pour+v%C3%A9rifier+le+moment+d%27enregistrement+du+driver%2C+la+conversion+du+TTL+par+le+Repository%2C+la+conser\u0026amp;theme=e73cb59538246989d21d6ff5\u0026amp;signature=45a086f27d92f79e1ddb73dabb1ed8b47081396ebd0704ae93b68708d6c98569\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://kawax.biz/fr/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/fr/advanced/package-cache-drivers.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://kawax.biz/fr/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://kawax.biz/jp/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://kawax.biz/en/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://kawax.biz/de/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://kawax.biz/es/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://kawax.biz/it/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://kawax.biz/ko/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"nl\" href=\"https://kawax.biz/nl/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://kawax.biz/zh-CN/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hant\" href=\"https://kawax.biz/zh-TW/advanced/package-cache-drivers\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://kawax.biz/jp/advanced/package-cache-drivers\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://kawax.biz/#organization\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146\"}},{\"@type\":\"WebSite\",\"@id\":\"https://kawax.biz#website\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://kawax.biz/fr/advanced/package-cache-drivers#webpage\",\"url\":\"https://kawax.biz/fr/advanced/package-cache-drivers\",\"name\":\"Stores de cache personnalisés et contrats pour les packages\",\"description\":\"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d'enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.\",\"dateModified\":\"2026-10-29T21:17:56.000Z\",\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"},\"breadcrumb\":{\"@id\":\"https://kawax.biz/fr/advanced/package-cache-drivers#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://kawax.biz/fr/advanced/package-cache-drivers#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Développement de packages\",\"item\":\"https://kawax.biz/fr/advanced/package-development\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Stores de cache personnalisés et contrats pour les packages\",\"item\":\"https://kawax.biz/fr/advanced/package-cache-drivers\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://kawax.biz/fr/advanced/package-cache-drivers#article\",\"headline\":\"Stores de cache personnalisés et contrats pour les packages\",\"name\":\"Stores de cache personnalisés et contrats pour les packages\",\"description\":\"Analysez le CacheManager et le contrat Store de Laravel 13 pour vérifier le moment d'enregistrement du driver, la conversion du TTL par le Repository, la conservation des instances et la prise en charge des verrous.\",\"url\":\"https://kawax.biz/fr/advanced/package-cache-drivers\",\"mainEntityOfPage\":{\"@id\":\"https://kawax.biz/fr/advanced/package-cache-drivers#webpage\"},\"dateModified\":\"2026-10-29T21:17:56.000Z\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"},\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Knowledge of Laravel\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Knowledge of Laravel","nav":{"global":null,"languages":[{"language":"jp","default":true,"pages":[{"title":"jp","href":"/jp/advanced/package-cache-drivers"}]},{"language":"en","pages":[{"title":"en","href":"/en/advanced/package-cache-drivers"}]},{"language":"de","pages":[{"title":"de","href":"/de/advanced/package-cache-drivers"}]},{"language":"es","pages":[{"title":"es","href":"/es/advanced/package-cache-drivers"}]},{"language":"fr","tabs":[{"tab":"Mes packages","pages":[{"title":"Mes packages","href":"/fr/packages/laravel-boost-copilot-cli"}]},{"tab":"Tutoriel","pages":[{"title":"Tutoriel","href":"/fr/introduction"}]},{"tab":"Guide","pages":[{"title":"Guide","href":"/fr/lifecycle"}]},{"tab":"Sujets avancés","groups":[{"group":"Développement IA","pages":[{"title":"Créer un serveur MCP avec Laravel","href":"/fr/advanced/mcp-server"},{"title":"Créer un agent personnalisé pour Boost","href":"/fr/advanced/boost-custom-agent"},{"title":"Créer un fournisseur personnalisé pour l'AI SDK","href":"/fr/advanced/ai-sdk-custom-provider"},{"title":"Les middlewares d'agent de Laravel AI SDK","href":"/fr/advanced/ai-sdk-agent-middleware"}]},{"group":"Patrons de conception","pages":[{"title":"Pattern Pipeline","href":"/fr/advanced/pipeline"},{"title":"Classe Fluent","href":"/fr/advanced/fluent"},{"title":"Trait Macroable","href":"/fr/advanced/macroable"},{"title":"Trait Conditionable","href":"/fr/advanced/conditionable"},{"title":"Trait InteractsWithTime","href":"/fr/advanced/interacts-with-time"},{"title":"Trait ForwardsCalls","href":"/fr/advanced/forwards-calls"},{"title":"Helper tap() et trait Tappable","href":"/fr/advanced/tap"},{"title":"Implémentation interne du helper once() — Once, Onceable et PreventsCircularRecursion","href":"/fr/advanced/once-helper"},{"title":"Trait Dumpable","href":"/fr/advanced/dumpable"},{"title":"Support Contracts (Arrayable / Jsonable / Htmlable / Responsable)","href":"/fr/advanced/support-contracts"},{"title":"Classe Lottery","href":"/fr/advanced/lottery"},{"title":"Messages d'ordre supérieur des collections","href":"/fr/advanced/higher-order-messages"},{"title":"Collection Deep Dive","href":"/fr/advanced/collection-deep-dive"},{"title":"Illuminate\\Support\\Manager — anatomie du système de drivers","href":"/fr/advanced/manager"},{"title":"API PHP Reflection","href":"/fr/advanced/php-reflection"},{"title":"PHP FFI","href":"/fr/advanced/ffi"},{"title":"PHP AST","href":"/fr/advanced/php-ast"}]},{"group":"Développement de packages","pages":[{"title":"Développement de packages Laravel","href":"/fr/advanced/package-development"},{"title":"Fonctionnement interne de la découverte automatique des packages","href":"/fr/advanced/package-discovery"},{"title":"Trait InteractsWithData","href":"/fr/advanced/interacts-with-data"},{"title":"Service providers différés","href":"/fr/advanced/deferred-provider"},{"title":"Gestion de la compatibilité de versions de package","href":"/fr/advanced/package-versioning"},{"title":"Pinning et sécurité de GitHub Actions","href":"/fr/advanced/github-actions-pinning"},{"title":"CHANGELOG et gestion des releases de packages","href":"/fr/advanced/package-changelog"},{"title":"Tester des packages Laravel avec Orchestra Testbench","href":"/fr/advanced/package-testing"},{"title":"Développer un package avec Testbench Workbench","href":"/fr/advanced/package-workbench"},{"title":"GeneratorCommand — implémenter des commandes make: personnalisées","href":"/fr/advanced/generator-command"},{"title":"Créer un starter kit Laravel","sidebarTitle":"Créer un starter kit","href":"/fr/advanced/starter-kit-creation"},{"title":"Analyse statique de packages (PHPStan / Larastan)","href":"/fr/advanced/package-static-analysis"},{"title":"Fusion et cache de la configuration des packages","href":"/fr/advanced/package-config-merging"},{"title":"Publier et mettre à jour les migrations d'un package","href":"/fr/advanced/package-migrations"},{"title":"Surcharger et mettre à jour les vues d'un package","href":"/fr/advanced/package-views"},{"title":"Enregistrement et cache des routes d'un package","href":"/fr/advanced/package-routes"},{"title":"Cache d'un package et intégration à optimize","href":"/fr/advanced/package-optimization"},{"title":"Assets publics d'un package et mises à jour","href":"/fr/advanced/package-assets"},{"title":"Surcharge et mise à jour des traductions d'un package","href":"/fr/advanced/package-translations"},{"title":"Hooks de résolution des services d'un package","href":"/fr/advanced/package-service-resolution"},{"title":"Ajouter des informations de diagnostic du package à about","href":"/fr/advanced/package-about"},{"title":"Enregistrement des commandes Artisan d'un package et résolution des dépendances","href":"/fr/advanced/package-commands"},{"title":"Enregistrement et mise en cache des écouteurs d'événements d'un package","href":"/fr/advanced/package-events"},{"title":"Conception du cycle de vie des services d'un package","href":"/fr/advanced/package-service-lifetimes"},{"title":"Enregistrement et portée des middlewares d'un package","href":"/fr/advanced/package-middleware"},{"title":"Extensions Blade d'un package et cache de compilation","href":"/fr/advanced/package-blade-extensions"},{"title":"Enregistrer des drivers Storage dans un package et les résoudre à nouveau","href":"/fr/advanced/package-filesystem-drivers"},{"title":"Canaux de notification personnalisés dans un package et vérification de l'envoi","href":"/fr/advanced/package-notification-channels"},{"title":"Tags de conteneur et agrégation de plugins d'un package","href":"/fr/advanced/package-container-tags"},{"title":"Client HTTP et tests dans un package","href":"/fr/advanced/package-http-client"},{"title":"Étendre et résoudre à nouveau les canaux de log d'un package","description":"Choisissez entre custom/via et LogManager::extend() de Laravel 13, et testez la journalisation en tenant compte de la conservation des canaux, de forgetChannel() et du repli.","href":"/fr/advanced/package-logging"},{"title":"Stores de cache personnalisés et contrats pour les packages","href":"/fr/advanced/package-cache-drivers"},{"title":"Enregistrer et tester des transports de mail dans un package","description":"Analysez le MailManager de Laravel 13 pour comprendre l'enregistrement d'un transport depuis un package, la transmission de la configuration, la conservation et la nouvelle résolution des Mailers, ainsi que les chemins d'envoi que le fake ne permet pas de vérifier.","href":"/fr/advanced/package-mail-transports"}]},{"group":"Structure d'application","pages":[{"title":"Structure d'application Laravel 11+","href":"/fr/advanced/app-structure"},{"title":"Guide de migration de l'ancienne vers la nouvelle structure","sidebarTitle":"Guide de migration","href":"/fr/advanced/app-structure-migration"},{"title":"FAQ sur la nouvelle structure d'application Laravel 11+","sidebarTitle":"FAQ nouvelle structure","href":"/fr/advanced/app-structure-faq"}]},{"group":"Nouveautés Laravel 13","pages":[{"title":"Attributs PHP","href":"/fr/advanced/php-attributes"},{"title":"Attributs PHP des contrôleurs","sidebarTitle":"Attributs de contrôleur","href":"/fr/advanced/controller-attributes"}]},{"group":"Eloquent approfondi","pages":[{"title":"Observateurs Eloquent et événements de modèle","href":"/fr/advanced/eloquent-observers"},{"title":"Scopes Eloquent","href":"/fr/advanced/eloquent-scopes"},{"title":"Casts personnalisés Eloquent","href":"/fr/advanced/eloquent-casts"},{"title":"Eloquent Bootable Traits","href":"/fr/advanced/eloquent-bootable-traits"},{"title":"Modèles Pivot personnalisés et chaperone","href":"/fr/advanced/eloquent-custom-pivot"}]},{"group":"Extension de la validation","pages":[{"title":"Règles de validation personnalisées","href":"/fr/advanced/custom-validation-rules"}]},{"group":"Extension de l'authentification","pages":[{"title":"Implémenter un guard d'authentification personnalisé","href":"/fr/advanced/custom-auth-guard"},{"title":"Laravel Fortify et les starter kits","href":"/fr/advanced/fortify"}]},{"group":"Sécurité","pages":[{"title":"Personnalisation de la limitation de débit","href":"/fr/advanced/rate-limiting"}]},{"group":"Files d'attente","pages":[{"title":"Contrôle de l'exécution des jobs de queue","href":"/fr/advanced/queue-job-control"}]},{"group":"Tests","pages":[{"title":"Tests avancés avec Pest","href":"/fr/advanced/testing-pest"}]},{"group":"Temps réel","pages":[{"title":"Au cœur du driver de broadcasting Mercure","href":"/fr/advanced/mercure-broadcasting"}]}]},{"tab":"Blog","pages":[{"title":"Blog","href":"/fr/blog/changelog/202609"}]}]},{"language":"it","pages":[{"title":"it","href":"/it/advanced/package-cache-drivers"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/advanced/package-cache-drivers"}]},{"language":"nl","pages":[{"title":"nl","href":"/nl/advanced/package-cache-drivers"}]},{"language":"zh-Hans","pages":[{"title":"zh-Hans","href":"/zh-CN/advanced/package-cache-drivers"}]},{"language":"zh-Hant","pages":[{"title":"zh-Hant","href":"/zh-TW/advanced/package-cache-drivers"}]}]},"basePath":"","title":"Stores de cache personnalisés et contrats pour les packages - Knowledge of Laravel","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":["2bfc744e19"],"chunks":["NarrationPlayer-BavXtvT-.js","types-CiTgMxws.js","shallow-DdluZBHX.js"]}