ConnectionFactory.php 2.7 KB

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