ConnectionFactory.php 2.0 KB

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