create-iterator
Iterator Pattern Generator
Creates Iterator pattern infrastructure for sequential access to collection elements.
When to Use
| Scenario | Example |
|---|---|
| Traverse collections | Order items, user lists, product catalog |
| Multiple traversal algorithms | Forward, backward, filtered iteration |
| Unified collection interface | Standardize iteration across different types |
| Hide collection structure | Encapsulate internal representation |
Component Characteristics
Iterator Interface
- Extends \Iterator or \IteratorAggregate
- Provides current(), next(), key(), valid()
- Enables foreach compatibility
- Type-safe element access
Concrete Iterator
- Implements traversal algorithm
- Maintains iteration state
- Provides filtering/transformation
- Resets to beginning via rewind()
Iterable Collection
- Implements \IteratorAggregate
- Returns iterator via getIterator()
- Encapsulates collection data
- Supports type-safe operations
Generation Process
Step 1: Generate Iterator Interface (Optional)
Path: src/Domain/{BoundedContext}/Iterator/
{Name}IteratorInterface.php— Custom iterator contract (extends \Iterator)
Step 2: Generate Concrete Iterator
Path: src/Domain/{BoundedContext}/Iterator/
{Name}Iterator.php— Iterator implementation with traversal logicFiltered{Name}Iterator.php— Filtered variant (optional)
Step 3: Generate Iterable Collection
Path: src/Domain/{BoundedContext}/Collection/
{Name}Collection.php— Collection implementing \IteratorAggregate
Step 4: Generate Value Objects (Optional)
Path: src/Domain/{BoundedContext}/ValueObject/
{Element}.php— Collection element type
Step 5: Generate Tests
{Name}IteratorTest.php— Iterator behavior tests{Name}CollectionTest.php— Collection tests
File Placement
| Component | Path |
|---|---|
| Iterator Interface | src/Domain/{BoundedContext}/Iterator/ |
| Concrete Iterator | src/Domain/{BoundedContext}/Iterator/ |
| Collection | src/Domain/{BoundedContext}/Collection/ |
| Value Objects | src/Domain/{BoundedContext}/ValueObject/ |
| Unit Tests | tests/Unit/Domain/{BoundedContext}/ |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Iterator Interface | {Name}IteratorInterface |
OrderIteratorInterface |
| Concrete Iterator | {Name}Iterator |
OrderIterator |
| Filtered Iterator | Filtered{Name}Iterator |
FilteredUserIterator |
| Collection | {Name}Collection |
OrderCollection |
| Test | {ClassName}Test |
OrderIteratorTest |
Quick Template Reference
Iterator (using \Iterator)
final class {Name}Iterator implements \Iterator
{
private int $position = 0;
public function __construct(
private readonly array $items
) {}
public function current(): {ElementType}
{
return $this->items[$this->position];
}
public function next(): void
{
++$this->position;
}
public function key(): int
{
return $this->position;
}
public function valid(): bool
{
return isset($this->items[$this->position]);
}
public function rewind(): void
{
$this->position = 0;
}
}
Iterable Collection (using \IteratorAggregate)
final readonly class {Name}Collection implements \IteratorAggregate, \Countable
{
/**
* @param array<{ElementType}> $items
*/
public function __construct(
private array $items = []
) {}
public function getIterator(): \Traversable
{
return new {Name}Iterator($this->items);
}
public function count(): int
{
return count($this->items);
}
}
Usage Example
// Create collection
$orders = new OrderCollection([
new Order(id: '1', total: 100),
new Order(id: '2', total: 200),
new Order(id: '3', total: 50),
]);
// Iterate with foreach
foreach ($orders as $order) {
echo $order->total();
}
// Filtered iteration
$filtered = new FilteredOrderIterator(
orders: $orders,
filter: fn(Order $o) => $o->total() > 100
);
foreach ($filtered as $order) {
// Only orders with total > 100
}
Common Iterator Patterns
| Domain | Iterators |
|---|---|
| Collections | OrderCollection, UserCollection, ProductCollection |
| Filtering | ActiveUserIterator, PendingOrderIterator |
| Pagination | PaginatedResultIterator, PageIterator |
| Tree Structures | DepthFirstIterator, BreadthFirstIterator |
| Composite | RecursiveIterator, FlatteningIterator |
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| Mutable iterator state leak | External modification | Use readonly collections |
| Breaking foreach contract | Invalid implementation | Implement all \Iterator methods |
| Expensive current() | Performance issues | Cache current element |
| Missing rewind() | Can't iterate twice | Implement proper rewind() |
| Violating LSP | Inconsistent behavior | Follow SPL iterator contracts |
References
For complete PHP templates and examples, see:
references/templates.md— Iterator, IteratorAggregate, Filtered Iterator templatesreferences/examples.md— OrderCollection, UserIterator, Pagination with tests
More from dykyi-roman/awesome-claude-code
psr-overview-knowledge
PHP Standards Recommendations (PSR) overview knowledge base. Provides comprehensive reference for all accepted PSRs including PSR-1,3,4,6,7,11,12,13,14,15,16,17,18,20. Use for PSR selection decisions and compliance audits.
22detect-code-smells
Detects code smells in PHP codebases. Identifies God Class, Feature Envy, Data Clumps, Long Parameter List, Long Method, Primitive Obsession, Message Chains, Inappropriate Intimacy. Generates actionable reports with refactoring recommendations.
15clean-arch-knowledge
Clean Architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Clean Architecture and Hexagonal Architecture audits.
15ddd-knowledge
DDD architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Domain-Driven Design audits.
14testing-knowledge
Testing knowledge base for PHP 8.4 projects. Provides testing pyramid, AAA pattern, naming conventions, isolation principles, DDD testing guidelines, and PHPUnit patterns.
12bug-root-cause-finder
Root cause analysis methods for PHP bugs. Provides 5 Whys technique, fault tree analysis, git bisect guidance, and stack trace parsing.
12