Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
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
}