StreamBuilder.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. namespace RocketTheme\Toolbox\StreamWrapper;
  3. /**
  4. * Class StreamBuilder
  5. * @package RocketTheme\Toolbox\StreamWrapper
  6. */
  7. class StreamBuilder
  8. {
  9. /**
  10. * @var array
  11. */
  12. protected $items = [];
  13. public function __construct(array $items = [])
  14. {
  15. foreach ($items as $scheme => $handler) {
  16. $this->add($scheme, $handler);
  17. }
  18. }
  19. /**
  20. * @param $scheme
  21. * @param $handler
  22. * @return $this
  23. * @throws \InvalidArgumentException
  24. */
  25. public function add($scheme, $handler)
  26. {
  27. if (isset($this->items[$scheme])) {
  28. if ($handler == $this->items[$scheme]) {
  29. return $this;
  30. }
  31. throw new \InvalidArgumentException("Stream '{$scheme}' has already been initialized.");
  32. }
  33. if (!is_subclass_of($handler, 'RocketTheme\Toolbox\StreamWrapper\StreamInterface')) {
  34. throw new \InvalidArgumentException("Stream '{$scheme}' has unknown or invalid type.");
  35. }
  36. if (!@stream_wrapper_register($scheme, $handler)) {
  37. throw new \InvalidArgumentException("Stream '{$scheme}' could not be initialized.");
  38. }
  39. $this->items[$scheme] = $handler;
  40. return $this;
  41. }
  42. /**
  43. * @param $scheme
  44. * @return $this
  45. */
  46. public function remove($scheme)
  47. {
  48. if (isset($this->items[$scheme])) {
  49. stream_wrapper_unregister($scheme);
  50. unset($this->items[$scheme]);
  51. }
  52. return $this;
  53. }
  54. /**
  55. * @return array
  56. */
  57. public function getStreams()
  58. {
  59. return $this->items;
  60. }
  61. /**
  62. * @param $scheme
  63. * @return bool
  64. */
  65. public function isStream($scheme)
  66. {
  67. return isset($this->items[$scheme]);
  68. }
  69. /**
  70. * @param $scheme
  71. * @return null
  72. */
  73. public function getStreamType($scheme)
  74. {
  75. return isset($this->items[$scheme]) ? $this->items[$scheme] : null;
  76. }
  77. }