ConnectionFactory.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace Predis;
  3. use Predis\Network\IConnectionSingle;
  4. class ConnectionFactory implements IConnectionFactory
  5. {
  6. private static $_globalSchemes;
  7. private $_instanceSchemes = array();
  8. public function __construct(Array $schemesMap = null)
  9. {
  10. $this->_instanceSchemes = self::ensureDefaultSchemes();
  11. if (isset($schemesMap)) {
  12. foreach ($schemesMap as $scheme => $initializer) {
  13. $this->defineConnection($scheme, $initializer);
  14. }
  15. }
  16. }
  17. private static function checkConnectionInitializer($initializer)
  18. {
  19. if (is_callable($initializer)) {
  20. return;
  21. }
  22. $initializerReflection = new \ReflectionClass($initializer);
  23. if (!$initializerReflection->isSubclassOf('\Predis\Network\IConnectionSingle')) {
  24. throw new \InvalidArgumentException(
  25. 'A connection initializer must be a valid connection class or a callable object'
  26. );
  27. }
  28. }
  29. private static function ensureDefaultSchemes()
  30. {
  31. if (!isset(self::$_globalSchemes)) {
  32. self::$_globalSchemes = array(
  33. 'tcp' => '\Predis\Network\StreamConnection',
  34. 'unix' => '\Predis\Network\StreamConnection',
  35. );
  36. }
  37. return self::$_globalSchemes;
  38. }
  39. public static function define($scheme, $connectionInitializer)
  40. {
  41. self::ensureDefaultSchemes();
  42. self::checkConnectionInitializer($connectionInitializer);
  43. self::$_globalSchemes[$scheme] = $connectionInitializer;
  44. }
  45. public function defineConnection($scheme, $connectionInitializer)
  46. {
  47. self::checkConnectionInitializer($connectionInitializer);
  48. $this->_instanceSchemes[$scheme] = $connectionInitializer;
  49. }
  50. public function create($parameters)
  51. {
  52. if (!$parameters instanceof IConnectionParameters) {
  53. $parameters = new ConnectionParameters($parameters);
  54. }
  55. $scheme = $parameters->scheme;
  56. if (!isset($this->_instanceSchemes[$scheme])) {
  57. throw new \InvalidArgumentException("Unknown connection scheme: $scheme");
  58. }
  59. $initializer = $this->_instanceSchemes[$scheme];
  60. if (!is_callable($initializer)) {
  61. return new $initializer($parameters);
  62. }
  63. $connection = call_user_func($initializer, $parameters);
  64. if (!$connection instanceof IConnectionSingle) {
  65. throw new \InvalidArgumentException(
  66. 'Objects returned by connection initializers must implement ' .
  67. 'the Predis\Network\IConnectionSingle interface'
  68. );
  69. }
  70. return $connection;
  71. }
  72. }