1. sfFactoryConfigHandler.class.php
  2. /** * sfFactoryConfigHandler allows you to specify which factory implementation the * system will use. * * @package symfony * @subpackage config * @author Fabien Potencier * @author Sean Kerr * @version SVN: $Id: sfFactoryConfigHandler.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $ */
  3. class sfFactoryConfigHandler 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 <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
  13. * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
  14. */
  15. public function execute($configFiles)
  16. {
  17. // parse the yaml
  18. $config = self::getConfiguration($configFiles);
  19. // init our data and includes arrays
  20. $includes = array();
  21. $instances = array();
  22. // available list of factories
  23. $factories = array('view_cache_manager', 'logger', 'i18n', 'controller', 'request', 'response', 'routing', 'storage', 'user', 'view_cache', 'mailer');
  24. // let's do our fancy work
  25. foreach ($factories as $factory)
  26. {
  27. // see if the factory exists for this controller
  28. $keys = $config[$factory];
  29. if (!isset($keys['class']))
  30. {
  31. // missing class key
  32. throw new sfParseException(sprintf('Configuration file "%s" specifies category "%s" with missing class key.', $configFiles[0], $factory));
  33. }
  34. $class = $keys['class'];
  35. if (isset($keys['file']))
  36. {
  37. // we have a file to include
  38. if (!is_readable($keys['file']))
  39. {
  40. // factory file doesn't exist
  41. throw new sfParseException(sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s".', $configFiles[0], $class, $keys['file']));
  42. }
  43. // append our data
  44. $includes[] = sprintf("require_once('%s');", $keys['file']);
  45. }
  46. // parse parameters
  47. $parameters = array();
  48. if (isset($keys['param']))
  49. {
  50. if (!is_array($keys['param']))
  51. {
  52. throw new InvalidArgumentException(sprintf('The "param" key for the "%s" factory must be an array (in %s).', $class, $configFiles[0]));
  53. }
  54. $parameters = $keys['param'];
  55. }
  56. // append new data
  57. switch ($factory)
  58. {
  59. case 'controller':
  60. $instances[] = sprintf(" \$class = sfConfig::get('sf_factory_controller', '%s');\n \$this->factories['controller'] = new \$class(\$this);", $class);
  61. break;
  62. case 'request':
  63. $parameters['no_script_name'] = sfConfig::get('sf_no_script_name');
  64. $instances[] = sprintf(" \$class = sfConfig::get('sf_factory_request', '%s');\n \$this->factories['request'] = new \$class(\$this->dispatcher, array(), array(), sfConfig::get('sf_factory_request_parameters', %s), sfConfig::get('sf_factory_request_attributes', array()));", $class, var_export($parameters, true));
  65. break;
  66. case 'response':
  67. $instances[] = sprintf(" \$class = sfConfig::get('sf_factory_response', '%s');\n \$this->factories['response'] = new \$class(\$this->dispatcher, sfConfig::get('sf_factory_response_parameters', array_merge(array('http_protocol' => isset(\$_SERVER['SERVER_PROTOCOL']) ? \$_SERVER['SERVER_PROTOCOL'] : null), %s)));", $class, var_export($parameters, true));
  68. // TODO: this is a bit ugly, as it only works for sfWebRequest & sfWebResponse combination. see #3397
  69. $instances[] = sprintf(" if (\$this->factories['request'] instanceof sfWebRequest \n && \$this->factories['response'] instanceof sfWebResponse \n && 'HEAD' == \$this->factories['request']->getMethod())\n { \n \$this->factories['response']->setHeaderOnly(true);\n }\n");
  70. break;
  71. case 'storage':
  72. $defaultParameters = array();
  73. $defaultParameters[] = sprintf("'auto_shutdown' => false, 'session_id' => \$this->getRequest()->getParameter('%s'),", $parameters['session_name']);
  74. if (is_subclass_of($class, 'sfDatabaseSessionStorage'))
  75. {
  76. $defaultParameters[] = sprintf("'database' => \$this->getDatabaseManager()->getDatabase('%s'),", isset($parameters['database']) ? $parameters['database'] : 'default');
  77. unset($parameters['database']);
  78. }
  79. $instances[] = sprintf(" \$class = sfConfig::get('sf_factory_storage', '%s');\n \$this->factories['storage'] = new \$class(array_merge(array(\n%s\n), sfConfig::get('sf_factory_storage_parameters', %s)));", $class, implode("\n", $defaultParameters), var_export($parameters, true));
  80. break;
  81. case 'user':
  82. $instances[] = sprintf(" \$class = sfConfig::get('sf_factory_user', '%s');\n \$this->factories['user'] = new \$class(\$this->dispatcher, \$this->factories['storage'], array_merge(array('auto_shutdown' => false, 'culture' => \$this->factories['request']->getParameter('sf_culture')), sfConfig::get('sf_factory_user_parameters', %s)));", $class, var_export($parameters, true));
  83. break;
  84. case 'view_cache':
  85. $instances[] = sprintf("\n if (sfConfig::get('sf_cache'))\n {\n".
  86. " \$class = sfConfig::get('sf_factory_view_cache', '%s');\n".
  87. " \$cache = new \$class(sfConfig::get('sf_factory_view_cache_parameters', %s));\n".
  88. " \$this->factories['viewCacheManager'] = new %s(\$this, \$cache, %s);\n".
  89. " }\n".
  90. " else\n".
  91. " {\n".
  92. " \$this->factories['viewCacheManager'] = null;\n".
  93. " }\n",
  94. $class, var_export($parameters, true), $config['view_cache_manager']['class'], var_export($config['view_cache_manager']['param'], true));
  95. break;
  96. case 'i18n':
  97. if (isset($parameters['cache']))
  98. {
  99. $cache = sprintf(" \$cache = new %s(%s);\n", $parameters['cache']['class'], var_export($parameters['cache']['param'], true));
  100. unset($parameters['cache']);
  101. }
  102. else
  103. {
  104. $cache = " \$cache = null;\n";
  105. }
  106. $instances[] = sprintf("\n if (sfConfig::get('sf_i18n'))\n {\n".
  107. " \$class = sfConfig::get('sf_factory_i18n', '%s');\n".
  108. "%s".
  109. " \$this->factories['i18n'] = new \$class(\$this->configuration, \$cache, %s);\n".
  110. " sfWidgetFormSchemaFormatter::setTranslationCallable(array(\$this->factories['i18n'], '__'));\n".
  111. " }\n"
  112. , $class, $cache, var_export($parameters, true)
  113. );
  114. break;
  115. case 'routing':
  116. if (isset($parameters['cache']))
  117. {
  118. $cache = sprintf(" \$cache = new %s(%s);\n", $parameters['cache']['class'], var_export($parameters['cache']['param'], true));
  119. unset($parameters['cache']);
  120. }
  121. else
  122. {
  123. $cache = " \$cache = null;\n";
  124. }
  125. $instances[] = sprintf(" \$class = sfConfig::get('sf_factory_routing', '%s');\n".
  126. " %s\n".
  127. "\$this->factories['routing'] = new \$class(\$this->dispatcher, \$cache, array_merge(array('auto_shutdown' => false, 'context' => \$this->factories['request']->getRequestContext()), sfConfig::get('sf_factory_routing_parameters', %s)));\n".
  128. "if (\$parameters = \$this->factories['routing']->parse(\$this->factories['request']->getPathInfo()))\n".
  129. "{\n".
  130. " \$this->factories['request']->addRequestParameters(\$parameters);\n".
  131. "}\n",
  132. $class, $cache, var_export($parameters, true)
  133. );
  134. break;
  135. case 'logger':
  136. $loggers = '';
  137. if (isset($parameters['loggers']))
  138. {
  139. foreach ($parameters['loggers'] as $name => $keys)
  140. {
  141. if (isset($keys['enabled']) && !$keys['enabled'])
  142. {
  143. continue;
  144. }
  145. if (!isset($keys['class']))
  146. {
  147. // missing class key
  148. throw new sfParseException(sprintf('Configuration file "%s" specifies logger "%s" with missing class key.', $configFiles[0], $name));
  149. }
  150. $condition = true;
  151. if (isset($keys['param']['condition']))
  152. {
  153. $condition = $keys['param']['condition'];
  154. unset($keys['param']['condition']);
  155. }
  156. if ($condition)
  157. {
  158. // create logger instance
  159. $loggers .= sprintf("\n\$logger = new %s(\$this->dispatcher, array_merge(array('auto_shutdown' => false), %s));\n\$this->factories['logger']->addLogger(\$logger);\n",
  160. $keys['class'],
  161. isset($keys['param']) ? var_export($keys['param'], true) : 'array()'
  162. );
  163. }
  164. }
  165. unset($parameters['loggers']);
  166. }
  167. $instances[] = sprintf(
  168. " \$class = sfConfig::get('sf_factory_logger', '%s');\n \$this->factories['logger'] = new \$class(\$this->dispatcher, array_merge(array('auto_shutdown' => false), sfConfig::get('sf_factory_logger_parameters', %s)));\n".
  169. " %s"
  170. , $class, var_export($parameters, true), $loggers);
  171. break;
  172. case 'mailer':
  173. $instances[] = sprintf(
  174. "require_once sfConfig::get('sf_symfony_lib_dir').'/vendor/swiftmailer/classes/Swift.php';\n".
  175. "Swift::registerAutoload();\n".
  176. "sfMailer::initialize();\n".
  177. "\$this->setMailerConfiguration(array_merge(array('class' => sfConfig::get('sf_factory_mailer', '%s')), sfConfig::get('sf_factory_mailer_parameters', %s)));\n"
  178. , $class, var_export($parameters, true));
  179. break;
  180. }
  181. }
  182. // compile data
  183. $retval = sprintf("<?php\n".
  184. "// auto-generated by sfFactoryConfigHandler\n".
  185. "// date: %s\n%s\n%s\n",
  186. date('Y/m/d H:i:s'), implode("\n", $includes),
  187. implode("\n", $instances));
  188. return $retval;
  189. }
  190. /**
  191. * @see sfConfigHandler
  192. */
  193. static public function getConfiguration(array $configFiles)
  194. {
  195. $config = self::replaceConstants(self::flattenConfigurationWithEnvironment(self::parseYamls($configFiles)));
  196. foreach ($config as $factory => $values)
  197. {
  198. if (isset($values['file']))
  199. {
  200. $config[$factory]['file'] = self::replacePath($values['file']);
  201. }
  202. }
  203. return $config;
  204. }
  205. }

Debug toolbar