ProcessorChain.php 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. namespace Predis\Commands\Processors;
  3. use Predis\Commands\ICommand;
  4. class ProcessorChain implements ICommandProcessorChain, \ArrayAccess {
  5. private $_processors;
  6. public function __construct($processors = array()) {
  7. foreach ($processors as $processor) {
  8. $this->add($processor);
  9. }
  10. }
  11. public function add(ICommandProcessor $processor) {
  12. $this->_processors[] = $processor;
  13. }
  14. public function remove(ICommandProcessor $processor) {
  15. $index = array_search($processor, $this->_processors, true);
  16. if ($index !== false) {
  17. unset($this->_processors);
  18. }
  19. }
  20. public function process(ICommand $command) {
  21. $count = count($this->_processors);
  22. for ($i = 0; $i < $count; $i++) {
  23. $this->_processors[$i]->process($command);
  24. }
  25. }
  26. public function getProcessors() {
  27. return $this->_processors;
  28. }
  29. public function getIterator() {
  30. return new \ArrayIterator($this->_processors);
  31. }
  32. public function count() {
  33. return count($this->_processors);
  34. }
  35. public function offsetExists($index) {
  36. return isset($this->_processors[$index]);
  37. }
  38. public function offsetGet($index) {
  39. return $this->_processors[$index];
  40. }
  41. public function offsetSet($index, $processor) {
  42. if (!$processor instanceof ICommandProcessor) {
  43. throw new \InvalidArgumentException(
  44. 'A processor chain can hold only instances of classes implementing '.
  45. 'the Predis\Commands\Preprocessors\ICommandProcessor interface'
  46. );
  47. }
  48. $this->_processors[$index] = $processor;
  49. }
  50. public function offsetUnset($index) {
  51. unset($this->_processors[$index]);
  52. }
  53. }