1. sfDatabaseConfigHandler.class.php
  2. /** * sfDatabaseConfigHandler allows you to setup database connections in a * configuration file that will be created for you automatically upon first * request. * * @package symfony * @subpackage config * @author Fabien Potencier * @author Sean Kerr * @version SVN: $Id: sfDatabaseConfigHandler.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $ */
  3. class sfDatabaseConfigHandler extends sfYamlConfigHandler
  4. {
  5. /**
  6. * Executes this configuration handler.
  7. *
  8. * @param array $configFiles An array of absolute filesystem path to a configuration file
  9. *
  10. * @return string Data to be written to a cache file
  11. *
  12. * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
  13. * @throws sfParseException If a requested configuration file is improperly formatted
  14. */
  15. public function execute($configFiles)
  16. {
  17. list($includes, $data) = $this->parse($configFiles);
  18. foreach ($includes as $i => $include)
  19. {
  20. $includes[$i] = sprintf("require_once('%s');", $include);
  21. }
  22. foreach ($data as $name => $database)
  23. {
  24. $data[$name] = sprintf("\n'%s' => new %s(%s),", $name, $database[0], var_export($database[1], true));
  25. }
  26. // compile data
  27. return sprintf("<?php\n".
  28. "// auto-generated by sfDatabaseConfigHandler\n".
  29. "// date: %s\n%s\nreturn array(%s);\n",
  30. date('Y/m/d H:i:s'), implode("\n", $includes), implode("\n", $data));
  31. }
  32. public function evaluate($configFiles)
  33. {
  34. list($includes, $data) = $this->parse($configFiles);
  35. foreach ($includes as $i => $include)
  36. {
  37. require_once($include);
  38. }
  39. $databases = array();
  40. foreach ($data as $name => $database)
  41. {
  42. $databases[$name] = new $database[0]($database[1]);
  43. }
  44. return $databases;
  45. }
  46. protected function parse($configFiles)
  47. {
  48. // parse the yaml
  49. $config = self::getConfiguration($configFiles);
  50. // init our data and includes arrays
  51. $data = array();
  52. $databases = array();
  53. $includes = array();
  54. // get a list of database connections
  55. foreach ($config as $name => $dbConfig)
  56. {
  57. // is this category already registered?
  58. if (in_array($name, $databases))
  59. {
  60. // this category is already registered
  61. throw new sfParseException(sprintf('Configuration file "%s" specifies previously registered category "%s".', $configFiles[0], $name));
  62. }
  63. // add this database
  64. $databases[] = $name;
  65. // let's do our fancy work
  66. if (!isset($dbConfig['class']))
  67. {
  68. // missing class key
  69. throw new sfParseException(sprintf('Configuration file "%s" specifies category "%s" with missing class key.', $configFiles[0], $name));
  70. }
  71. if (isset($dbConfig['file']))
  72. {
  73. // we have a file to include
  74. if (!is_readable($dbConfig['file']))
  75. {
  76. // database file doesn't exist
  77. throw new sfParseException(sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s".', $configFiles[0], $dbConfig['class'], $dbConfig['file']));
  78. }
  79. // append our data
  80. $includes[] = $dbConfig['file'];
  81. }
  82. // parse parameters
  83. $parameters = array();
  84. if (isset($dbConfig['param']))
  85. {
  86. $parameters = $dbConfig['param'];
  87. }
  88. $parameters['name'] = $name;
  89. // append new data
  90. $data[$name] = array($dbConfig['class'], $parameters);
  91. }
  92. return array($includes, $data);
  93. }
  94. /**
  95. * @see sfConfigHandler
  96. */
  97. static public function getConfiguration(array $configFiles)
  98. {
  99. $config = self::replaceConstants(self::flattenConfigurationWithEnvironment(self::parseYamls($configFiles)));
  100. foreach ($config as $name => $dbConfig)
  101. {
  102. if (isset($dbConfig['file']))
  103. {
  104. $config[$name]['file'] = self::replacePath($dbConfig['file']);
  105. }
  106. }
  107. return $config;
  108. }
  109. }

Debug toolbar