| 1 |
lars |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
/*
|
|
|
4 |
* This file is part of the symfony package.
|
|
|
5 |
* (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
6 |
* (c) 2004-2006 Sean Kerr <sean@code-box.org>
|
|
|
7 |
*
|
|
|
8 |
* For the full copyright and license information, please view the LICENSE
|
|
|
9 |
* file that was distributed with this source code.
|
|
|
10 |
*/
|
|
|
11 |
|
|
|
12 |
/**
|
|
|
13 |
* sfFactoryConfigHandler allows you to specify which factory implementation the
|
|
|
14 |
* system will use.
|
|
|
15 |
*
|
|
|
16 |
* @package symfony
|
|
|
17 |
* @subpackage config
|
|
|
18 |
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
19 |
* @author Sean Kerr <sean@code-box.org>
|
|
|
20 |
* @version SVN: $Id: sfFactoryConfigHandler.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
|
|
|
21 |
*/
|
|
|
22 |
class sfFactoryConfigHandler extends sfYamlConfigHandler
|
|
|
23 |
{
|
|
|
24 |
/**
|
|
|
25 |
* Executes this configuration handler.
|
|
|
26 |
*
|
|
|
27 |
* @param array $configFiles An array of absolute filesystem path to a configuration file
|
|
|
28 |
*
|
|
|
29 |
* @return string Data to be written to a cache file
|
|
|
30 |
*
|
|
|
31 |
* @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
|
|
|
32 |
* @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
|
|
|
33 |
*/
|
|
|
34 |
public function execute($configFiles)
|
|
|
35 |
{
|
|
|
36 |
// parse the yaml
|
|
|
37 |
$config = self::getConfiguration($configFiles);
|
|
|
38 |
|
|
|
39 |
// init our data and includes arrays
|
|
|
40 |
$includes = array();
|
|
|
41 |
$instances = array();
|
|
|
42 |
|
|
|
43 |
// available list of factories
|
|
|
44 |
$factories = array('view_cache_manager', 'logger', 'i18n', 'controller', 'request', 'response', 'routing', 'storage', 'user', 'view_cache', 'mailer');
|
|
|
45 |
|
|
|
46 |
// let's do our fancy work
|
|
|
47 |
foreach ($factories as $factory)
|
|
|
48 |
{
|
|
|
49 |
// see if the factory exists for this controller
|
|
|
50 |
$keys = $config[$factory];
|
|
|
51 |
|
|
|
52 |
if (!isset($keys['class']))
|
|
|
53 |
{
|
|
|
54 |
// missing class key
|
|
|
55 |
throw new sfParseException(sprintf('Configuration file "%s" specifies category "%s" with missing class key.', $configFiles[0], $factory));
|
|
|
56 |
}
|
|
|
57 |
|
|
|
58 |
$class = $keys['class'];
|
|
|
59 |
|
|
|
60 |
if (isset($keys['file']))
|
|
|
61 |
{
|
|
|
62 |
// we have a file to include
|
|
|
63 |
if (!is_readable($keys['file']))
|
|
|
64 |
{
|
|
|
65 |
// factory file doesn't exist
|
|
|
66 |
throw new sfParseException(sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s".', $configFiles[0], $class, $keys['file']));
|
|
|
67 |
}
|
|
|
68 |
|
|
|
69 |
// append our data
|
|
|
70 |
$includes[] = sprintf("require_once('%s');", $keys['file']);
|
|
|
71 |
}
|
|
|
72 |
|
|
|
73 |
// parse parameters
|
|
|
74 |
$parameters = array();
|
|
|
75 |
if (isset($keys['param']))
|
|
|
76 |
{
|
|
|
77 |
if (!is_array($keys['param']))
|
|
|
78 |
{
|
|
|
79 |
throw new InvalidArgumentException(sprintf('The "param" key for the "%s" factory must be an array (in %s).', $class, $configFiles[0]));
|
|
|
80 |
}
|
|
|
81 |
|
|
|
82 |
$parameters = $keys['param'];
|
|
|
83 |
}
|
|
|
84 |
|
|
|
85 |
// append new data
|
|
|
86 |
switch ($factory)
|
|
|
87 |
{
|
|
|
88 |
case 'controller':
|
|
|
89 |
$instances[] = sprintf(" \$class = sfConfig::get('sf_factory_controller', '%s');\n \$this->factories['controller'] = new \$class(\$this);", $class);
|
|
|
90 |
break;
|
|
|
91 |
|
|
|
92 |
case 'request':
|
|
|
93 |
$parameters['no_script_name'] = sfConfig::get('sf_no_script_name');
|
|
|
94 |
$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));
|
|
|
95 |
break;
|
|
|
96 |
|
|
|
97 |
case 'response':
|
|
|
98 |
$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));
|
|
|
99 |
// TODO: this is a bit ugly, as it only works for sfWebRequest & sfWebResponse combination. see #3397
|
|
|
100 |
$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");
|
|
|
101 |
break;
|
|
|
102 |
|
|
|
103 |
case 'storage':
|
|
|
104 |
$defaultParameters = array();
|
|
|
105 |
$defaultParameters[] = sprintf("'auto_shutdown' => false, 'session_id' => \$this->getRequest()->getParameter('%s'),", $parameters['session_name']);
|
|
|
106 |
if (is_subclass_of($class, 'sfDatabaseSessionStorage'))
|
|
|
107 |
{
|
|
|
108 |
$defaultParameters[] = sprintf("'database' => \$this->getDatabaseManager()->getDatabase('%s'),", isset($parameters['database']) ? $parameters['database'] : 'default');
|
|
|
109 |
unset($parameters['database']);
|
|
|
110 |
}
|
|
|
111 |
|
|
|
112 |
$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));
|
|
|
113 |
break;
|
|
|
114 |
|
|
|
115 |
case 'user':
|
|
|
116 |
$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));
|
|
|
117 |
break;
|
|
|
118 |
|
|
|
119 |
case 'view_cache':
|
|
|
120 |
$instances[] = sprintf("\n if (sfConfig::get('sf_cache'))\n {\n".
|
|
|
121 |
" \$class = sfConfig::get('sf_factory_view_cache', '%s');\n".
|
|
|
122 |
" \$cache = new \$class(sfConfig::get('sf_factory_view_cache_parameters', %s));\n".
|
|
|
123 |
" \$this->factories['viewCacheManager'] = new %s(\$this, \$cache, %s);\n".
|
|
|
124 |
" }\n".
|
|
|
125 |
" else\n".
|
|
|
126 |
" {\n".
|
|
|
127 |
" \$this->factories['viewCacheManager'] = null;\n".
|
|
|
128 |
" }\n",
|
|
|
129 |
$class, var_export($parameters, true), $config['view_cache_manager']['class'], var_export($config['view_cache_manager']['param'], true));
|
|
|
130 |
break;
|
|
|
131 |
|
|
|
132 |
case 'i18n':
|
|
|
133 |
if (isset($parameters['cache']))
|
|
|
134 |
{
|
|
|
135 |
$cache = sprintf(" \$cache = new %s(%s);\n", $parameters['cache']['class'], var_export($parameters['cache']['param'], true));
|
|
|
136 |
unset($parameters['cache']);
|
|
|
137 |
}
|
|
|
138 |
else
|
|
|
139 |
{
|
|
|
140 |
$cache = " \$cache = null;\n";
|
|
|
141 |
}
|
|
|
142 |
|
|
|
143 |
$instances[] = sprintf("\n if (sfConfig::get('sf_i18n'))\n {\n".
|
|
|
144 |
" \$class = sfConfig::get('sf_factory_i18n', '%s');\n".
|
|
|
145 |
"%s".
|
|
|
146 |
" \$this->factories['i18n'] = new \$class(\$this->configuration, \$cache, %s);\n".
|
|
|
147 |
" sfWidgetFormSchemaFormatter::setTranslationCallable(array(\$this->factories['i18n'], '__'));\n".
|
|
|
148 |
" }\n"
|
|
|
149 |
, $class, $cache, var_export($parameters, true)
|
|
|
150 |
);
|
|
|
151 |
break;
|
|
|
152 |
|
|
|
153 |
case 'routing':
|
|
|
154 |
if (isset($parameters['cache']))
|
|
|
155 |
{
|
|
|
156 |
$cache = sprintf(" \$cache = new %s(%s);\n", $parameters['cache']['class'], var_export($parameters['cache']['param'], true));
|
|
|
157 |
unset($parameters['cache']);
|
|
|
158 |
}
|
|
|
159 |
else
|
|
|
160 |
{
|
|
|
161 |
$cache = " \$cache = null;\n";
|
|
|
162 |
}
|
|
|
163 |
|
|
|
164 |
$instances[] = sprintf(" \$class = sfConfig::get('sf_factory_routing', '%s');\n".
|
|
|
165 |
" %s\n".
|
|
|
166 |
"\$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".
|
|
|
167 |
"if (\$parameters = \$this->factories['routing']->parse(\$this->factories['request']->getPathInfo()))\n".
|
|
|
168 |
"{\n".
|
|
|
169 |
" \$this->factories['request']->addRequestParameters(\$parameters);\n".
|
|
|
170 |
"}\n",
|
|
|
171 |
$class, $cache, var_export($parameters, true)
|
|
|
172 |
);
|
|
|
173 |
break;
|
|
|
174 |
|
|
|
175 |
case 'logger':
|
|
|
176 |
$loggers = '';
|
|
|
177 |
if (isset($parameters['loggers']))
|
|
|
178 |
{
|
|
|
179 |
foreach ($parameters['loggers'] as $name => $keys)
|
|
|
180 |
{
|
|
|
181 |
if (isset($keys['enabled']) && !$keys['enabled'])
|
|
|
182 |
{
|
|
|
183 |
continue;
|
|
|
184 |
}
|
|
|
185 |
|
|
|
186 |
if (!isset($keys['class']))
|
|
|
187 |
{
|
|
|
188 |
// missing class key
|
|
|
189 |
throw new sfParseException(sprintf('Configuration file "%s" specifies logger "%s" with missing class key.', $configFiles[0], $name));
|
|
|
190 |
}
|
|
|
191 |
|
|
|
192 |
$condition = true;
|
|
|
193 |
if (isset($keys['param']['condition']))
|
|
|
194 |
{
|
|
|
195 |
$condition = $keys['param']['condition'];
|
|
|
196 |
unset($keys['param']['condition']);
|
|
|
197 |
}
|
|
|
198 |
|
|
|
199 |
if ($condition)
|
|
|
200 |
{
|
|
|
201 |
// create logger instance
|
|
|
202 |
$loggers .= sprintf("\n\$logger = new %s(\$this->dispatcher, array_merge(array('auto_shutdown' => false), %s));\n\$this->factories['logger']->addLogger(\$logger);\n",
|
|
|
203 |
$keys['class'],
|
|
|
204 |
isset($keys['param']) ? var_export($keys['param'], true) : 'array()'
|
|
|
205 |
);
|
|
|
206 |
}
|
|
|
207 |
}
|
|
|
208 |
|
|
|
209 |
unset($parameters['loggers']);
|
|
|
210 |
}
|
|
|
211 |
|
|
|
212 |
$instances[] = sprintf(
|
|
|
213 |
" \$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".
|
|
|
214 |
" %s"
|
|
|
215 |
, $class, var_export($parameters, true), $loggers);
|
|
|
216 |
break;
|
|
|
217 |
|
|
|
218 |
case 'mailer':
|
|
|
219 |
$instances[] = sprintf(
|
|
|
220 |
"require_once sfConfig::get('sf_symfony_lib_dir').'/vendor/swiftmailer/classes/Swift.php';\n".
|
|
|
221 |
"Swift::registerAutoload();\n".
|
|
|
222 |
"sfMailer::initialize();\n".
|
|
|
223 |
"\$this->setMailerConfiguration(array_merge(array('class' => sfConfig::get('sf_factory_mailer', '%s')), sfConfig::get('sf_factory_mailer_parameters', %s)));\n"
|
|
|
224 |
, $class, var_export($parameters, true));
|
|
|
225 |
break;
|
|
|
226 |
}
|
|
|
227 |
}
|
|
|
228 |
|
|
|
229 |
// compile data
|
|
|
230 |
$retval = sprintf("<?php\n".
|
|
|
231 |
"// auto-generated by sfFactoryConfigHandler\n".
|
|
|
232 |
"// date: %s\n%s\n%s\n",
|
|
|
233 |
date('Y/m/d H:i:s'), implode("\n", $includes),
|
|
|
234 |
implode("\n", $instances));
|
|
|
235 |
|
|
|
236 |
return $retval;
|
|
|
237 |
}
|
|
|
238 |
|
|
|
239 |
/**
|
|
|
240 |
* @see sfConfigHandler
|
|
|
241 |
*/
|
|
|
242 |
static public function getConfiguration(array $configFiles)
|
|
|
243 |
{
|
|
|
244 |
$config = self::replaceConstants(self::flattenConfigurationWithEnvironment(self::parseYamls($configFiles)));
|
|
|
245 |
|
|
|
246 |
foreach ($config as $factory => $values)
|
|
|
247 |
{
|
|
|
248 |
if (isset($values['file']))
|
|
|
249 |
{
|
|
|
250 |
$config[$factory]['file'] = self::replacePath($values['file']);
|
|
|
251 |
}
|
|
|
252 |
}
|
|
|
253 |
|
|
|
254 |
return $config;
|
|
|
255 |
}
|
|
|
256 |
}
|