[ Index ]
 

Code source de Symfony 1.0.0

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/lib/config/ -> sfFilterConfigHandler.class.php (source)

   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.
   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   * sfFilterConfigHandler allows you to register filters with the system.
  14   *
  15   * @package    symfony
  16   * @subpackage config
  17   * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
  18   * @author     Sean Kerr <skerr@mojavi.org>
  19   * @version    SVN: $Id: sfFilterConfigHandler.class.php 3258 2007-01-13 12:12:22Z fabien $
  20   */
  21  class sfFilterConfigHandler extends sfYamlConfigHandler
  22  {
  23    /**
  24     * Executes this configuration handler
  25     *
  26     * @param array An array of absolute filesystem path to a configuration file
  27     *
  28     * @return string Data to be written to a cache file
  29     *
  30     * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
  31     * @throws sfParseException If a requested configuration file is improperly formatted
  32     */
  33    public function execute($configFiles)
  34    {
  35      // parse the yaml
  36      $config = $this->parseYaml($configFiles[0]);
  37      foreach (array_slice($configFiles, 1) as $i => $configFile)
  38      {
  39        // we get the order of the new file and merge with the previous configurations
  40        $previous = $config;
  41  
  42        $config = array();
  43        foreach ($this->parseYaml($configFile) as $key => $value)
  44        {
  45          $value = (array) $value;
  46          $config[$key] = isset($previous[$key]) ? sfToolkit::arrayDeepMerge($previous[$key], $value) : $value;
  47        }
  48  
  49        // check that every key in previous array is still present (to avoid problem when upgrading)
  50        foreach (array_keys($previous) as $key)
  51        {
  52          if (!isset($config[$key]))
  53          {
  54            throw new sfConfigurationException(sprintf('The filter name "%s" is defined in "%s" but not present in "%s" file. To disable a filter, add a "enabled" key with a false value', $key, $configFiles[$i], $configFile));
  55          }
  56        }
  57      }
  58  
  59      // init our data and includes arrays
  60      $data     = array();
  61      $includes = array();
  62  
  63      $execution = false;
  64      $rendering = false;
  65  
  66      // let's do our fancy work
  67      foreach ($config as $category => $keys)
  68      {
  69        if (isset($keys['enabled']) && !$keys['enabled'])
  70        {
  71          continue;
  72        }
  73  
  74        if (!isset($keys['class']))
  75        {
  76          // missing class key
  77          $error = 'Configuration file "%s" specifies category "%s" with missing class key';
  78          $error = sprintf($error, $configFiles[0], $category);
  79  
  80          throw new sfParseException($error);
  81        }
  82  
  83        $class = $keys['class'];
  84  
  85        if (isset($keys['file']))
  86        {
  87          // we have a file to include
  88          $file = $this->replaceConstants($keys['file']);
  89          $file = $this->replacePath($file);
  90  
  91          if (!is_readable($file))
  92          {
  93            // filter file doesn't exist
  94            $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $class, $file);
  95  
  96            throw new sfParseException($error);
  97          }
  98  
  99          // append our data
 100          $includes[] = sprintf("require_once('%s');\n", $file);
 101        }
 102  
 103        $condition = true;
 104        if (isset($keys['param']['condition']))
 105        {
 106          $condition = $this->replaceConstants($keys['param']['condition']);
 107          unset($keys['param']['condition']);
 108        }
 109  
 110        $type = isset($keys['param']['type']) ? $keys['param']['type'] : null;
 111        unset($keys['param']['type']);
 112  
 113        if ($condition)
 114        {
 115          // parse parameters
 116          $parameters = isset($keys['param']) ? var_export($keys['param'], true) : 'null';
 117  
 118          // append new data
 119          if ('security' == $type)
 120          {
 121            $data[] = $this->addSecurityFilter($category, $class, $parameters);
 122          }
 123          else
 124          {
 125            $data[] = $this->addFilter($category, $class, $parameters);
 126          }
 127  
 128          if ('rendering' == $type)
 129          {
 130            $rendering = true;
 131          }
 132  
 133          if ('execution' == $type)
 134          {
 135            $execution = true;
 136          }
 137        }
 138      }
 139  
 140      if (!$rendering)
 141      {
 142        $error = sprintf('Configuration file "%s" must register a filter of type "rendering"', $configFiles[0]);
 143  
 144        throw new sfParseException($error);
 145      }
 146  
 147      if (!$execution)
 148      {
 149        $error = sprintf('Configuration file "%s" must register a filter of type "execution"', $configFiles[0]);
 150  
 151        throw new sfParseException($error);
 152      }
 153  
 154      // compile data
 155      $retval = sprintf("<?php\n".
 156                        "// auto-generated by sfFilterConfigHandler\n".
 157                        "// date: %s%s\n%s\n\n", date('Y/m/d H:i:s'),
 158                        implode("\n", $includes), implode("\n", $data));
 159  
 160      return $retval;
 161    }
 162  
 163    /**
 164     * Adds a filter statement to the data.
 165     *
 166     * @param string The category name
 167     * @param string The filter class name
 168     * @param array  Filter default parameters
 169     *
 170     * @return string The PHP statement
 171     */
 172    protected function addFilter($category, $class, $parameters)
 173    {
 174      return sprintf("\nlist(\$class, \$parameters) = (array) sfConfig::get('sf_%s_filter', array('%s', %s));\n".
 175                        "\$filter = new \$class();\n".
 176                        "\$filter->initialize(\$this->context, \$parameters);\n".
 177                        "\$filterChain->register(\$filter);",
 178                        $category, $class, $parameters);
 179    }
 180  
 181    /**
 182     * Adds a security filter statement to the data.
 183     *
 184     * @param string The category name
 185     * @param string The filter class name
 186     * @param array  Filter default parameters
 187     *
 188     * @return string The PHP statement
 189     */
 190    protected function addSecurityFilter($category, $class, $parameters)
 191    {
 192      return <<<EOF
 193  
 194  // does this action require security?
 195  if (\$actionInstance->isSecure())
 196  {
 197    if (!in_array('sfSecurityUser', class_implements(\$this->context->getUser())))
 198    {
 199      \$error = 'Security is enabled, but your sfUser implementation does not implement sfSecurityUser interface';
 200      throw new sfSecurityException(\$error);
 201    }
 202    {$this->addFilter($category, $class, $parameters)}
 203  }
 204  EOF;
 205    }
 206  }


Généré le : Fri Mar 16 22:42:14 2007 par Balluche grâce à PHPXref 0.7