Development

/branches/1.4/lib/config/sfFactoryConfigHandler.class.php

You must first sign up to be able to contribute.

root/branches/1.4/lib/config/sfFactoryConfigHandler.class.php

Revision 33299, 11.2 kB (checked in by fabien, 2 years ago)

reverted 33226 because of side effects (refs #8348)

  • Property svn:mime-type set to text/x-php
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
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$
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 }
257
Note: See TracBrowser for help on using the browser.