ConnectionSchemes.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. namespace Predis;
  3. class ConnectionSchemes implements IConnectionSchemes {
  4. private static $_globalSchemes;
  5. private $_instanceSchemes;
  6. public function __construct(Array $schemesMap = array()) {
  7. self::ensureDefaultSchemes();
  8. foreach ($schemesMap as $connectionClass) {
  9. self::checkConnectionClass($connectionClass);
  10. }
  11. $this->_instanceSchemes = $schemesMap;
  12. }
  13. private static function ensureDefaultSchemes() {
  14. if (!isset(self::$_globalSchemes)) {
  15. self::$_globalSchemes = array(
  16. 'tcp' => '\Predis\Network\StreamConnection',
  17. 'unix' => '\Predis\Network\StreamConnection',
  18. );
  19. }
  20. }
  21. private static function checkConnectionClass($class) {
  22. $connectionReflection = new \ReflectionClass($class);
  23. if (!$connectionReflection->isSubclassOf('\Predis\Network\IConnectionSingle')) {
  24. throw new ClientException(
  25. "The class '$class' is not a valid connection class"
  26. );
  27. }
  28. }
  29. public static function define($scheme, $connectionClass) {
  30. self::ensureDefaultSchemes();
  31. self::checkConnectionClass($connectionClass);
  32. self::$_globalSchemes[$scheme] = $connectionClass;
  33. }
  34. public function newConnection($parameters) {
  35. if (!$parameters instanceof ConnectionParameters) {
  36. $parameters = new ConnectionParameters($parameters);
  37. }
  38. $scheme = $parameters->scheme;
  39. if (isset($this->_instanceSchemes[$scheme])) {
  40. $connection = $this->_instanceSchemes[$scheme];
  41. }
  42. else if (isset(self::$_globalSchemes[$scheme])) {
  43. $connection = self::$_globalSchemes[$scheme];
  44. }
  45. else {
  46. throw new ClientException("Unknown connection scheme: $scheme");
  47. }
  48. return new $connection($parameters);
  49. }
  50. public function newConnectionByScheme($scheme, $parameters = array()) {
  51. if ($parameters instanceof ConnectionParameters) {
  52. $parameters = $parameters->toArray();
  53. }
  54. if (is_array($parameters)) {
  55. $parameters['scheme'] = $scheme;
  56. return $this->newConnection($parameters);
  57. }
  58. throw new \InvalidArgumentException("Invalid type for connection parameters");
  59. }
  60. }