[13.x] Make Cache touch() TTL required and remove redundant value fetching #59121
Merged
taylorotwell merged 1 commit intolaravel:13.xfrom Mar 10, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR makes two changes to
Cache::touch()before the 13.x API surface is finalized:1. Make
$ttla required parameterCurrently,
Cache::touch($key)with no TTL silently converts the item to live forever via$this->forever().This is surprising behavior for a method whose purpose is TTL extension. A developer calling
Cache::touch('session-key')to "bump" an expiration would not expect to accidentally make the item permanent.Unlike
put(), wherenullTTL meaning "forever" is a convenience shorthand with a clear value being stored,touch()is specifically about managing expiration. Having it silently remove expiration contradicts its purpose.Making
$ttlrequired forces explicit intent: developers who want an item to live forever should callCache::forever()directly.2. Remove the redundant
$this->get()call from the Repository layerThe current implementation fetches the full cached value at the Repository level before delegating to the store:
This is unnecessary because every store implementation already handles the "key doesn't exist" case by returning false:
For the four atomic stores (Redis, Database, DynamoDB, Memcached), the Repository-level get() is pure overhead, it deserializes the entire cached value only to throw it away. For File and APC stores, the value ends up being fetched twice: once at the Repository layer and once inside the store.
After this change, the Repository simply converts the TTL and delegates:
Change before the new cache touch API goes live
This is a breaking change to a new cache API introduced in 13.x, so there is no backward-compatibility concern with 11.x or 12.x users. The method signature changes from
touch($key, $ttl = null)totouch($key, $ttl).