Skip to content

Commit d840af9

Browse files
committed
add iterator pattern
1 parent 9d99b01 commit d840af9

File tree

7 files changed

+150
-0
lines changed

7 files changed

+150
-0
lines changed

app/Controller/BehavioralController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@ public function command()
2020

2121
$queue->work();
2222
}
23+
24+
25+
public function iterator()
26+
{
27+
(new \App\Factory\Behavioral\Iterator\UserRoles\Application)->run();
28+
}
2329
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php namespace App\Factory\Behavioral\Iterator\UserRoles;
2+
3+
class Application
4+
{
5+
const ADMIN = 'admin';
6+
const MANAGER = 'manager';
7+
8+
public function run()
9+
{
10+
$basheer = new User('Basheer', new Role(self::ADMIN));
11+
$shaheer = new User('Shaheer', new Role(self::MANAGER));
12+
13+
$admin = new UserRole($basheer);
14+
15+
$shaher = new UserRole($shaheer);
16+
$ali = new UserRole(new User('ALI', new Role(self::MANAGER)));
17+
18+
$admin->addUserRole($shaher);
19+
$admin->addUserRole($ali);
20+
21+
foreach($admin as $user) {
22+
echo 'Name: ' . $user->getName() . ' Role: ' . $user->getRole() . '<br/>';
23+
}
24+
}
25+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php namespace App\Factory\Behavioral\Iterator\UserRoles;
2+
3+
class Role
4+
{
5+
public $name;
6+
7+
public function __construct(string $name)
8+
{
9+
$this->name = $name;
10+
}
11+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php namespace App\Factory\Behavioral\Iterator\UserRoles;
2+
3+
class RoleIterator implements \Iterator, \Countable
4+
{
5+
private $users = [];
6+
private $counter = 0;
7+
8+
public function __construct(UserRole $userRole)
9+
{
10+
$this->addUserRole($userRole);
11+
$this->counter = 0;
12+
}
13+
14+
public function addUserRole(UserRole $userRole): void
15+
{
16+
foreach($userRole->getUsers() as $user) {
17+
$this->users[] = $user;
18+
}
19+
}
20+
21+
public function current(): UserRole
22+
{
23+
return $this->users[$this->counter];
24+
}
25+
26+
public function next(): void
27+
{
28+
$this->counter++;
29+
}
30+
31+
public function rewind(): void
32+
{
33+
$this->counter = 0;
34+
}
35+
36+
public function valid(): bool
37+
{
38+
return isset($this->users[$this->counter]);
39+
}
40+
41+
public function key(): int
42+
{
43+
return $this->counter;
44+
}
45+
46+
public function count(): int
47+
{
48+
return count($this->users);
49+
}
50+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php namespace App\Factory\Behavioral\Iterator\UserRoles;
2+
3+
class User
4+
{
5+
public $name;
6+
public $role;
7+
8+
public function __construct(string $name, Role $role)
9+
{
10+
$this->name = $name;
11+
$this->role = $role;
12+
}
13+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php namespace App\Factory\Behavioral\Iterator\UserRoles;
2+
3+
class UserRole implements \Countable, \IteratorAggregate
4+
{
5+
private $user;
6+
private $storage;
7+
8+
public function __construct(User $user)
9+
{
10+
$this->storage = new \SplObjectStorage();
11+
$this->user = $user;
12+
}
13+
14+
public function addUserRole(UserRole $userRole)
15+
{
16+
$this->storage->attach($userRole);
17+
}
18+
19+
20+
public function getUsers(): \SplObjectStorage
21+
{
22+
return $this->storage;
23+
}
24+
25+
public function getIterator(): RoleIterator
26+
{
27+
return new RoleIterator($this);
28+
}
29+
30+
public function count(): int
31+
{
32+
return count(new RoleIterator($this));
33+
}
34+
35+
public function getName(): string
36+
{
37+
return $this->user->name;
38+
}
39+
40+
public function getRole()
41+
{
42+
return $this->user->role->name;
43+
}
44+
}

bootstraps/routes.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@
2020
['GET', '/structural/proxy', ['App\Controller\StructuralController', 'proxy']],
2121
['GET', '/behavioral', ['App\Controller\BehavioralController', 'chainOfResponsibility']],
2222
['GET', '/behavioral/command', ['App\Controller\BehavioralController', 'command']],
23+
['GET', '/behavioral/iterator', ['App\Controller\BehavioralController', 'iterator']],
2324
// ['GET', '/{slug}', ['App\Controller\CreationalController', 'show']],
2425
];

0 commit comments

Comments
 (0)