fix(UniqueGenerator): prevent memory exhaustion when chaining unique()->optional() #1028
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.
Summary
unique()->optional()->method()orunique()->valid()->method()chainsoptional()andvalid()methods toUniqueGeneratorthat properly wrap the generator chainProblem
When calling
$faker->unique()->optional()->safeEmail(), theUniqueGenerator::__call()handler would:optional()on the underlying generator, returning aChanceGeneratorserialize()thisChanceGeneratorfor uniqueness trackingChanceGeneratorcontains a reference to the entireGeneratorwith all providers, causing massive serialized strings and exponential memory growthSolution
By adding explicit
optional()andvalid()methods toUniqueGenerator, we ensure proper generator chaining:ChanceGeneratornow wrapsUniqueGenerator(not the baseGenerator)ChanceGeneratordelegates back toUniqueGeneratorUniqueGeneratorthen serializes only the final value (e.g., the email string), not generator objectsTest plan
UniqueGeneratortests passFixes #1027