ConnectionFactory.php 1.9 KB

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