Development

/branches/1.2/lib/config/sfApplicationConfiguration.class.php

You must first sign up to be able to contribute.

root/branches/1.2/lib/config/sfApplicationConfiguration.class.php

Revision 17858, 17.8 kB (checked in by FabianLange, 5 years ago)

[1.1, 1.2, 1.3] fixed some codeing standards (fixes #6376 - patch from gimler)

  • 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) Fabien Potencier <fabien.potencier@symfony-project.com>
6  *
7  * For the full copyright and license information, please view the LICENSE
8  * file that was distributed with this source code.
9  */
10
11 /**
12  * sfConfiguration represents a configuration for a symfony application.
13  *
14  * @package    symfony
15  * @subpackage config
16  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
17  * @version    SVN: $Id$
18  */
19 abstract class sfApplicationConfiguration extends ProjectConfiguration
20 {
21   static protected
22     $coreLoaded    = false,
23     $loadedHelpers = array();
24
25   protected
26     $configCache = null,
27     $application = null,
28     $environment = null,
29     $debug       = false,
30     $config      = array();
31
32   /**
33    * Constructor.
34    *
35    * @param string            $environment The environment name
36    * @param Boolean           $debug       true to enable debug mode
37    * @param string            $rootDir     The project root directory
38    * @param sfEventDispatcher $dispatcher  An event dispatcher
39    */
40   public function __construct($environment, $debug, $rootDir = null, sfEventDispatcher $dispatcher = null)
41   {
42     $this->environment = $environment;
43     $this->debug       = (boolean) $debug;
44     $this->application = str_replace('Configuration', '', get_class($this));
45
46     parent::__construct($rootDir, $dispatcher);
47
48     $this->configure();
49
50     $this->initConfiguration();
51
52     if (sfConfig::get('sf_check_lock'))
53     {
54       $this->checkLock();
55     }
56
57     if (sfConfig::get('sf_check_symfony_version'))
58     {
59       $this->checkSymfonyVersion();
60     }
61
62     $this->initialize();
63
64     // store current sfConfig values
65     $this->config = sfConfig::getAll();
66   }
67
68   /**
69    * Configures the current configuration.
70    *
71    * Override this method if you want to customize your application configuration.
72    */
73   public function configure()
74   {
75   }
76
77   /**
78    * Initialized the current configuration.
79    *
80    * Override this method if you want to customize your application initialization.
81    */
82   public function initialize()
83   {
84   }
85
86   public function activate()
87   {
88     sfConfig::clear();
89     sfConfig::add($this->config);
90   }
91
92   /**
93    * @see sfProjectConfiguration
94    */
95   public function initConfiguration()
96   {
97     $configCache = $this->getConfigCache();
98
99     // in debug mode, start global timer
100     if ($this->isDebug() && !sfWebDebugPanelTimer::isStarted())
101     {
102       sfWebDebugPanelTimer::startTime();
103     }
104
105     // required core classes for the framework
106     if (!sfConfig::get('sf_debug') && !sfConfig::get('sf_test') && !self::$coreLoaded)
107     {
108       $configCache->import('config/core_compile.yml', false);
109     }
110
111     $this->dispatcher->connect('autoload.filter_config', array($this, 'filterAutoloadConfig'));
112     sfAutoload::getInstance()->register();
113
114     // load base settings
115     include($configCache->checkConfig('config/settings.yml'));
116     if ($file = $configCache->checkConfig('config/app.yml', true))
117     {
118       include($file);
119     }
120
121     if (false !== sfConfig::get('sf_csrf_secret'))
122     {
123       sfForm::enableCSRFProtection(sfConfig::get('sf_csrf_secret'));
124     }
125
126     sfWidget::setCharset(sfConfig::get('sf_charset'));
127     sfValidatorBase::setCharset(sfConfig::get('sf_charset'));
128
129     // force setting default timezone if not set
130     if ($default_timezone = sfConfig::get('sf_default_timezone'))
131     {
132       date_default_timezone_set($default_timezone);
133     }
134     else if (sfConfig::get('sf_force_default_timezone', true))
135     {
136       date_default_timezone_set(@date_default_timezone_get());
137     }
138
139     // error settings
140     ini_set('display_errors', $this->isDebug() ? 'on' : 'off');
141     error_reporting(sfConfig::get('sf_error_reporting'));
142
143     // initialize plugin configuration objects
144     $this->initializePlugins();
145
146     // Disabled by default in symfony 1.1 because it causes problems with Doctrine.
147     // If you want to enable it in your application, just copy the spl_autoload_register() line
148     // in your configuration class.
149     if (0 && $this->isDebug())
150     {
151       spl_autoload_register(array(sfAutoload::getInstance(), 'autoloadAgain'));
152     }
153
154     // compress output
155     if (!self::$coreLoaded)
156     {
157       ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');
158     }
159
160     self::$coreLoaded = true;
161   }
162
163   /**
164    * Initializes plugin configuration objects.
165    */
166   protected function initializePlugins()
167   {
168     foreach ($this->pluginConfigurations as $name => $configuration)
169     {
170       if (
171         false === $configuration->initialize()
172         &&
173         is_readable($config = $configuration->getRootDir().'/config/config.php')
174       )
175       {
176         require $config;
177       }
178     }
179   }
180
181   /**
182    * Adds enabled plugins to autoload config.
183    *
184    * @param sfEvent $event
185    * @param array   $config
186    *
187    * @return array
188    */
189   public function filterAutoloadConfig(sfEvent $event, array $config)
190   {
191     foreach ($this->pluginConfigurations as $name => $configuration)
192     {
193       $config = $configuration->filterAutoloadConfig($event, $config);
194     }
195
196     return $config;
197   }
198
199   /**
200    * Returns a configuration cache object for the current configuration.
201    *
202    * @return sfConfigCache A sfConfigCache instance
203    */
204   public function getConfigCache()
205   {
206     if (is_null($this->configCache))
207     {
208       $this->configCache = new sfConfigCache($this);
209     }
210
211     return $this->configCache;
212   }
213
214   /**
215    * Check lock files to see if we're not in a cache cleaning process.
216    *
217    * @return void
218    */
219   public function checkLock()
220   {
221     if (
222       sfToolkit::hasLockFile(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.$this->getApplication().'_'.$this->getEnvironment().'-cli.lck', 5)
223       ||
224       sfToolkit::hasLockFile(sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.$this->getApplication().'_'.$this->getEnvironment().'.lck')
225     )
226     {
227       // application is not available - we'll find the most specific unavailable page...
228       $files = array(
229         sfConfig::get('sf_app_config_dir').'/unavailable.php',
230         sfConfig::get('sf_config_dir').'/unavailable.php',
231         sfConfig::get('sf_web_dir').'/errors/unavailable.php',
232         sfConfig::get('sf_symfony_lib_dir').'/exception/data/unavailable.php',
233       );
234
235       foreach ($files as $file)
236       {
237         if (is_readable($file))
238         {
239           include $file;
240           break;
241         }
242       }
243
244       die(1);
245     }
246   }
247
248   /**
249    * Checks symfony version and clears cache if recent update.
250    *
251    * @return void
252    */
253   public function checkSymfonyVersion()
254   {
255     // recent symfony update?
256     if (SYMFONY_VERSION != @file_get_contents(sfConfig::get('sf_config_cache_dir').'/VERSION'))
257     {
258       // clear cache
259       sfToolkit::clearDirectory(sfConfig::get('sf_config_cache_dir'));
260     }
261   }
262
263   /**
264    * Sets the project root directory.
265    *
266    * @param string $rootDir The project root directory
267    */
268   public function setRootDir($rootDir)
269   {
270     parent::setRootDir($rootDir);
271
272     sfConfig::add(array(
273       'sf_app'         => $this->getApplication(),
274       'sf_environment' => $this->getEnvironment(),
275       'sf_debug'       => $this->isDebug(),
276     ));
277
278     $this->setAppDir(sfConfig::get('sf_apps_dir').DIRECTORY_SEPARATOR.$this->getApplication());
279   }
280
281   /**
282    * Sets the app directory.
283    *
284    * @param string $appDir The absolute path to the app dir.
285    */
286   public function setAppDir($appDir)
287   {
288     sfConfig::add(array(
289       'sf_app_dir' => $appDir,
290
291       // SF_APP_DIR directory structure
292       'sf_app_config_dir'   => $appDir.DIRECTORY_SEPARATOR.'config',
293       'sf_app_lib_dir'      => $appDir.DIRECTORY_SEPARATOR.'lib',
294       'sf_app_module_dir'   => $appDir.DIRECTORY_SEPARATOR.'modules',
295       'sf_app_template_dir' => $appDir.DIRECTORY_SEPARATOR.'templates',
296       'sf_app_i18n_dir'     => $appDir.DIRECTORY_SEPARATOR.'i18n',
297     ));
298   }
299
300   /**
301    * @see sfProjectConfiguration
302    */
303   public function setCacheDir($cacheDir)
304   {
305     parent::setCacheDir($cacheDir);
306
307     sfConfig::add(array(
308       'sf_app_base_cache_dir' => $cacheDir.DIRECTORY_SEPARATOR.$this->getApplication(),
309       'sf_app_cache_dir'      => $appCacheDir = $cacheDir.DIRECTORY_SEPARATOR.$this->getApplication().DIRECTORY_SEPARATOR.$this->getEnvironment(),
310
311       // SF_CACHE_DIR directory structure
312       'sf_template_cache_dir' => $appCacheDir.DIRECTORY_SEPARATOR.'template',
313       'sf_i18n_cache_dir'     => $appCacheDir.DIRECTORY_SEPARATOR.'i18n',
314       'sf_config_cache_dir'   => $appCacheDir.DIRECTORY_SEPARATOR.'config',
315       'sf_test_cache_dir'     => $appCacheDir.DIRECTORY_SEPARATOR.'test',
316       'sf_module_cache_dir'   => $appCacheDir.DIRECTORY_SEPARATOR.'modules',
317     ));
318   }
319
320   /**
321    * Gets directories where controller classes are stored for a given module.
322    *
323    * @param string $moduleName The module name
324    *
325    * @return array An array of directories
326    */
327   public function getControllerDirs($moduleName)
328   {
329     $dirs = array();
330     foreach (sfConfig::get('sf_module_dirs', array()) as $key => $value)
331     {
332       $dirs[$key.'/'.$moduleName.'/actions'] = $value;
333     }
334
335     $dirs[sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/actions'] = false;             // application
336
337     foreach ($this->getPluginPaths() as $path)
338     {
339       if (is_dir($dir = $path.'/modules/'.$moduleName.'/actions'))
340       {
341         $dirs[$dir] = true;                                                                   // plugins
342       }
343     }
344
345     $dirs[sfConfig::get('sf_symfony_lib_dir').'/controller/'.$moduleName.'/actions'] = true// core modules
346
347     return $dirs;
348   }
349
350   /**
351    * Gets directories where lib files are stored for a given module.
352    *
353    * @param string $moduleName The module name
354    *
355    * @return array An array of directories
356    */
357   public function getLibDirs($moduleName)
358   {
359     $dirs = array();
360     foreach (sfConfig::get('sf_module_dirs', array()) as $key => $value)
361     {
362       $dirs[] = $key.'/'.$moduleName.'/lib';
363     }
364
365     $dirs[] = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/lib';                  // application
366     $dirs = array_merge($dirs, $this->getPluginSubPaths('/modules/'.$moduleName.'/lib')); // plugins
367     $dirs[] = sfConfig::get('sf_symfony_lib_dir').'/controller/'.$moduleName.'/lib';      // core modules
368     $dirs[] = sfConfig::get('sf_module_cache_dir').'/auto'.ucfirst($moduleName.'/lib');   // generated templates in cache
369
370     return $dirs;
371   }
372
373   /**
374    * Gets directories where template files are stored for a given module.
375    *
376    * @param string $moduleName The module name
377    *
378    * @return array An array of directories
379    */
380   public function getTemplateDirs($moduleName)
381   {
382     $dirs = array();
383     foreach (sfConfig::get('sf_module_dirs', array()) as $key => $value)
384     {
385       $dirs[] = $key.'/'.$moduleName.'/templates';
386     }
387
388     $dirs[] = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/templates';                  // application
389     $dirs = array_merge($dirs, $this->getPluginSubPaths('/modules/'.$moduleName.'/templates')); // plugins
390     $dirs[] = sfConfig::get('sf_symfony_lib_dir').'/controller/'.$moduleName.'/templates';      // core modules
391     $dirs[] = sfConfig::get('sf_module_cache_dir').'/auto'.ucfirst($moduleName.'/templates');   // generated templates in cache
392
393     return $dirs;
394   }
395
396   /**
397    * Gets the helper directories for a given module name.
398    *
399    * @param string $moduleName The module name
400    *
401    * @return array An array of directories
402    */
403   public function getHelperDirs($moduleName = '')
404   {
405     $dirs = array();
406
407     if ($moduleName)
408     {
409       $dirs[] = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/lib/helper'; // module
410
411       $dirs = array_merge($dirs, $this->getPluginSubPaths('/modules/'.$moduleName.'/lib/helper'));
412     }
413
414     return array_merge(
415       $dirs,
416       array(
417         sfConfig::get('sf_app_lib_dir').'/helper',         // application
418         sfConfig::get('sf_lib_dir').'/helper',             // project
419       ),
420       $this->getPluginSubPaths('/lib/helper'),             // plugins
421       array(sfConfig::get('sf_symfony_lib_dir').'/helper') // symfony
422     );
423   }
424
425   /**
426    * Gets the template directory to use for a given module and template file.
427    *
428    * @param string $moduleName   The module name
429    * @param string $templateFile The template file
430    *
431    * @return string A template directory
432    */
433   public function getTemplateDir($moduleName, $templateFile)
434   {
435     foreach ($this->getTemplateDirs($moduleName) as $dir)
436     {
437       if (is_readable($dir.'/'.$templateFile))
438       {
439         return $dir;
440       }
441     }
442
443     return null;
444   }
445
446   /**
447    * Gets the template to use for a given module and template file.
448    *
449    * @param string $moduleName   The module name
450    * @param string $templateFile The template file
451    *
452    * @return string A template path
453    */
454   public function getTemplatePath($moduleName, $templateFile)
455   {
456     $dir = $this->getTemplateDir($moduleName, $templateFile);
457
458     return $dir ? $dir.'/'.$templateFile : null;
459   }
460
461   /**
462    * Gets the decorator directories.
463    *
464    * @return array An array of the decorator directories
465    */
466   public function getDecoratorDirs()
467   {
468     return array(sfConfig::get('sf_app_template_dir'));
469   }
470
471   /**
472    * Gets the decorator directory for a given template.
473    *
474    * @param string $template The template file
475    *
476    * @return string A template directory
477    */
478   public function getDecoratorDir($template)
479   {
480     foreach ($this->getDecoratorDirs() as $dir)
481     {
482       if (is_readable($dir.'/'.$template))
483       {
484         return $dir;
485       }
486     }
487   }
488
489   /**
490    * Gets the i18n directories to use globally.
491    *
492    * @return array An array of i18n directories
493    */
494   public function getI18NGlobalDirs()
495   {
496     $dirs = array();
497
498     // application
499     if (is_dir($dir = sfConfig::get('sf_app_i18n_dir')))
500     {
501       $dirs[] = $dir;
502     }
503
504     // plugins
505     return array_merge($dirs, $this->getPluginSubPaths('/i18n'));
506   }
507
508   /**
509    * Gets the i18n directories to use for a given module.
510    *
511    * @param string $moduleName The module name
512    *
513    * @return array An array of i18n directories
514    */
515   public function getI18NDirs($moduleName)
516   {
517     $dirs = array();
518
519     // module
520     if (is_dir($dir = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/i18n'))
521     {
522       $dirs[] = $dir;
523     }
524
525     // application
526     if (is_dir($dir = sfConfig::get('sf_app_i18n_dir')))
527     {
528       $dirs[] = $dir;
529     }
530
531     return array_merge(
532       $dirs,
533       $this->getPluginSubPaths('/modules/'.$moduleName.'/i18n'), // module in plugins
534       $this->getPluginSubPaths('/i18n')                          // plugins
535     );
536   }
537
538   /**
539    * Gets the configuration file paths for a given relative configuration path.
540    *
541    * @param string $configPath The configuration path
542    *
543    * @return array An array of paths
544    */
545   public function getConfigPaths($configPath)
546   {
547     $globalConfigPath = basename(dirname($configPath)).'/'.basename($configPath);
548
549     $files = array(
550       sfConfig::get('sf_symfony_lib_dir').'/config/'.$globalConfigPath,              // symfony
551     );
552
553     foreach ($this->getPluginPaths() as $path)
554     {
555       if (is_file($file = $path.'/'.$globalConfigPath))
556       {
557         $files[] = $file;                                                            // plugins
558       }
559     }
560
561     $files = array_merge($files, array(
562       sfConfig::get('sf_root_dir').'/'.$globalConfigPath,                            // project
563       sfConfig::get('sf_root_dir').'/'.$configPath,                                  // project
564       sfConfig::get('sf_app_dir').'/'.$globalConfigPath,                             // application
565       sfConfig::get('sf_app_cache_dir').'/'.$configPath,                             // generated modules
566     ));
567
568     foreach ($this->getPluginPaths() as $path)
569     {
570       if (is_file($file = $path.'/'.$configPath))
571       {
572         $files[] = $file;                                                            // plugins
573       }
574     }
575
576     $files[] = sfConfig::get('sf_app_dir').'/'.$configPath;                          // module
577
578     $configs = array();
579     foreach (array_unique($files) as $file)
580     {
581       if (is_readable($file))
582       {
583         $configs[] = $file;
584       }
585     }
586
587     return $configs;
588   }
589
590   /**
591    * Loads helpers.
592    *
593    * @param array  $helpers    An array of helpers to load
594    * @param string $moduleName A module name (optional)
595    */
596   public function loadHelpers($helpers, $moduleName = '')
597   {
598     $dirs = $this->getHelperDirs($moduleName);
599     foreach ((array) $helpers as $helperName)
600     {
601       if (isset(self::$loadedHelpers[$helperName]))
602       {
603         continue;
604       }
605
606       $fileName = $helperName.'Helper.php';
607       foreach ($dirs as $dir)
608       {
609         $included = false;
610         if (is_readable($dir.'/'.$fileName))
611         {
612           include_once($dir.'/'.$fileName);
613           $included = true;
614           break;
615         }
616       }
617
618       if (!$included)
619       {
620         // search in the include path
621         if ((@include_once('helper/'.$fileName)) != 1)
622         {
623           $dirs = array_merge($dirs, explode(PATH_SEPARATOR, get_include_path()));
624
625           // remove sf_root_dir from dirs
626           foreach ($dirs as &$dir)
627           {
628             $dir = str_replace('%SF_ROOT_DIR%', sfConfig::get('sf_root_dir'), $dir);
629           }
630
631           throw new InvalidArgumentException(sprintf('Unable to load "%sHelper.php" helper in: %s.', $helperName, implode(', ', $dirs)));
632         }
633       }
634
635       self::$loadedHelpers[$helperName] = true;
636     }
637   }
638
639   /**
640    * @deprecated
641    */
642   public function loadPluginConfig()
643   {
644     $this->initializePlugins();
645   }
646
647   /**
648    * Returns the application name.
649    *
650    * @return string The application name
651    */
652   public function getApplication()
653   {
654     return $this->application;
655   }
656
657   /**
658    * Returns the environment name.
659    *
660    * @return string The environment name
661    */
662   public function getEnvironment()
663   {
664     return $this->environment;
665   }
666
667   /**
668    * Returns true if this configuration has debug enabled.
669    *
670    * @return Boolean true if the configuration has debug enabled, false otherwise
671    */
672   public function isDebug()
673   {
674     return $this->debug;
675   }
676 }
677
Note: See TracBrowser for help on using the browser.