ConnectionFactory.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. public function createByScheme($scheme, $parameters = array()) {
  53. if ($parameters instanceof IConnectionParameters) {
  54. $parameters = $parameters->toArray();
  55. }
  56. if (is_array($parameters)) {
  57. $parameters['scheme'] = $scheme;
  58. return $this->create($parameters);
  59. }
  60. throw new \InvalidArgumentException("Invalid type for connection parameters");
  61. }
  62. }