Development

Changeset 2661

You must first sign up to be able to contribute.

Changeset 2661

Show
Ignore:
Timestamp:
11/13/06 11:43:43 (2 years ago)
Author:
fabien
Message:

moved symfony core filters to filters.yml to allow greater flexibility in filter registration and ordering

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/data/config/factories.yml

    r1999 r2661  
    1717      session_name: symfony 
    1818 
    19   execution_filter: 
    20     class: sfExecutionFilter 
    21  
    22   rendering_filter: 
    23     class: sfRenderingFilter 
    24  
    25   security_filter: 
    26     class: sfBasicSecurityFilter 
    27  
    2819  view_cache: 
    2920    class: sfFileCache 
  • trunk/data/skeleton/app/app/config/filters.yml

    r500 r2661  
     1rendering: ~ 
     2web_debug: ~ 
     3security:  ~ 
     4 
     5# generally, you will want to insert your own filters here 
     6 
     7cache:     ~ 
     8common:    ~ 
     9flash:     ~ 
     10execution: ~ 
  • trunk/data/tasks/sfPakeUpgrade.php

    r2635 r2661  
    7777  { 
    7878    $app = str_replace(DIRECTORY_SEPARATOR.sfConfig::get('sf_app_module_dir_name'), '', $app_module_dir); 
    79     pake_echo_action('upgrade 0.8', sprintf('[upgrading application "%s"]', $app)); 
     79    pake_echo_action('upgrade 0.8', pakeColor::colorize(sprintf('upgrading application "%s"', $app), array('fg' => 'cyan'))); 
    8080 
    8181    $app_dir = sfConfig::get('sf_apps_dir_name').'/'.$app; 
     
    8383    // upgrade config.php 
    8484    _upgrade_0_8_config_php($app_dir); 
     85 
     86    // upgrade filters.yml 
     87    _upgrade_0_8_filters_yml($app_dir); 
    8588 
    8689    // upgrade all modules 
     
    118121  } 
    119122 
    120   pake_echo_comment('you can now:'); 
    121   pake_echo_comment(' - rebuild model: symfony propel-build-model'); 
    122   pake_echo_comment(' - clear cache: symfony cc'); 
     123  pake_echo_comment('Now, you must:'); 
     124  pake_echo_comment(' - rebuild your model classes: symfony propel-build-model'); 
     125  pake_echo_comment(' - clear the cache: symfony cc'); 
    123126} 
    124127 
     
    369372} 
    370373 
     374function _upgrade_0_8_filters_yml($app_dir) 
     375{ 
     376  pake_echo_action('upgrade 0.8', 'upgrading filters.yml'); 
     377 
     378  $configFile = $app_dir.DIRECTORY_SEPARATOR.sfConfig::get('sf_config_dir_name').DIRECTORY_SEPARATOR.'filters.yml'; 
     379  $content = file_get_contents($configFile); 
     380 
     381  // default symfony filters 
     382  $default = file_get_contents(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/app/config/filters.yml'); 
     383 
     384  $placeholder = '# generally, you will want to insert your own filters here'; 
     385 
     386  // upgrade module filters.yml 
     387  $seen = false; 
     388  $yml_files = pakeFinder::type('file')->name('filters.yml')->in($app_dir.DIRECTORY_SEPARATOR.'modules'); 
     389  foreach ($yml_files as $yml_file) 
     390  { 
     391    $module_content = file_get_contents($yml_file); 
     392 
     393    if (false === strpos($module_content, 'rendering:')) 
     394    { 
     395      $module_content = str_replace($placeholder, $placeholder."\n".$content."\n".$module_content, $default); 
     396 
     397      file_put_contents($yml_file, $module_content); 
     398 
     399      if (!$seen) 
     400      { 
     401        pake_echo_comment('filters.yml now contains core symfony filters'); 
     402      } 
     403 
     404      $seen = true; 
     405    } 
     406  } 
     407 
     408  // upgrade app filters.yml 
     409  if (false === strpos($content, 'rendering:')) 
     410  { 
     411    $content = str_replace($placeholder, $placeholder."\n".$content, $default); 
     412 
     413    file_put_contents($configFile, $content); 
     414 
     415    if (!$seen) 
     416    { 
     417      pake_echo_comment('filters.yml now contains core symfony filters'); 
     418    } 
     419  } 
     420} 
     421 
    371422function _upgrade_0_8_main_config_php() 
    372423{ 
  • trunk/lib/config/sfFactoryConfigHandler.class.php

    r2569 r2661  
    4949 
    5050    // available list of factories 
    51     $factories = array('controller', 'request', 'response', 'storage', 'user', 'security_filter', 'execution_filter', 'rendering_filter', 'view_cache'); 
     51    $factories = array('controller', 'request', 'response', 'storage', 'user', 'view_cache'); 
    5252 
    5353    // let's do our fancy work 
     
    128128          $inits[] = sprintf("  \$this->user->initialize(\$this, %s);", $parameters); 
    129129          break; 
    130  
    131         case 'security_filter': 
    132           // append creation/initialization in one swipe 
    133           $inits[] = sprintf("\n  if (sfConfig::get('sf_use_security'))\n  {\n". 
    134                              "    sfConfig::set('sf_factory_security_filter', array('%s', %s));\n  }\n", 
    135                              $class, $parameters); 
    136           break; 
    137  
    138         case 'execution_filter': 
    139           // append execution filter class name 
    140           $inits[] = sprintf("  sfConfig::set('sf_factory_execution_filter', array('%s', %s));", $class, $parameters); 
    141           break; 
    142  
    143         case 'rendering_filter': 
    144           // append rendering filter class name 
    145           $inits[] = sprintf("  sfConfig::set('sf_factory_rendering_filter', array('%s', %s));", $class, $parameters); 
    146           break; 
    147  
    148130        case 'view_cache': 
    149131          // append view cache class name 
  • trunk/lib/config/sfFilterConfigHandler.class.php

    r2569 r2661  
    3434  { 
    3535    // parse the yaml 
    36     $config = $this->parseYamls($configFiles); 
     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    } 
    3758 
    3859    // init our data and includes arrays 
     
    4061    $includes = array(); 
    4162 
     63    $execution = false; 
     64    $rendering = false; 
     65 
    4266    // let's do our fancy work 
    4367    foreach ($config as $category => $keys) 
    4468    { 
     69      if (isset($keys['enabled']) && !$keys['enabled']) 
     70      { 
     71        continue; 
     72      } 
     73 
    4574      if (!isset($keys['class'])) 
    4675      { 
     
    6493          // filter file doesn't exist 
    6594          $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $class, $file); 
     95 
    6696          throw new sfParseException($error); 
    6797        } 
     
    71101      } 
    72102 
     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 
    73113      // parse parameters 
    74       $parameters = (isset($keys['param']) ? var_export($keys['param'], true) : 'null')
     114      $parameters = isset($keys['param']) ? var_export($keys['param'], true) : 'null'
    75115 
    76       // append new data 
    77       $data[] = sprintf("\n\$filter = new %s();\n". 
    78                         "\$filter->initialize(\$this->context, %s);\n". 
    79                         "\$filterChain->register(\$filter);", 
    80                         $class, $parameters); 
     116      if ($condition) 
     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); 
    81152    } 
    82153 
     
    89160    return $retval; 
    90161  } 
     162 
     163  protected function addFilter($category, $class, $parameters) 
     164  { 
     165    return sprintf("\nlist(\$class, \$parameters) = (array) sfConfig::get('sf_%s_filter', array('%s', %s));\n". 
     166                      "\$filter = new \$class();\n". 
     167                      "\$filter->initialize(\$this->context, \$parameters);\n". 
     168                      "\$filterChain->register(\$filter);", 
     169                      $category, $class, $parameters); 
     170  } 
     171 
     172  protected function addSecurityFilter($category, $class, $parameters) 
     173  { 
     174    return <<<EOF 
     175 
     176// does this action require security? 
     177if (\$actionInstance->isSecure()) 
     178{ 
     179  if (!in_array('sfSecurityUser', class_implements(\$this->context->getUser()))) 
     180  { 
     181    \$error = 'Security is enabled, but your sfUser implementation does not implement sfSecurityUser interface'; 
     182    throw new sfSecurityException(\$error); 
     183  } 
     184  {$this->addFilter($category, $class, $parameters)} 
    91185} 
     186EOF; 
     187  } 
     188} 
  • trunk/lib/controller/sfController.class.php

    r2569 r2661  
    529529  public function loadFilters($filterChain, $actionInstance) 
    530530  { 
    531     // register the rendering filter 
    532     list($renderingFilterClassName, $renderingFilterParameters) = (array) sfConfig::get('sf_factory_rendering_filter'); 
    533     if (!class_exists($renderingFilterClassName)) 
    534     { 
    535       throw new sfConfigurationException(sprintf('Rendering filter class "%s" does not exists', $renderingFilterClassName)); 
    536     } 
    537     $renderFilter = new $renderingFilterClassName(); 
    538     $renderFilter->initialize($this->context, $renderingFilterParameters); 
    539     $filterChain->register($renderFilter); 
    540  
    541     if (sfConfig::get('sf_web_debug')) 
    542     { 
    543       // register web debug toolbar filter 
    544       $webDebugFilter = new sfWebDebugFilter(); 
    545       $webDebugFilter->initialize($this->context); 
    546       $filterChain->register($webDebugFilter); 
    547     } 
    548  
    549     if (sfConfig::get('sf_available')) 
    550     { 
    551       // the application is available so we'll register 
    552       // global and module filters, otherwise skip them 
    553  
    554       // does this action require security? 
    555       if (sfConfig::get('sf_use_security') && $actionInstance->isSecure()) 
    556       { 
    557         if (!in_array('sfSecurityUser', class_implements($this->context->getUser()))) 
    558         { 
    559           $error = 'Security is enabled, but your sfUser implementation does not implement sfSecurityUser interface'; 
    560           throw new sfSecurityException($error); 
    561         } 
    562  
    563         // register security filter 
    564         list($securityFilterClassName, $securityFilterParameters) = (array) sfConfig::get('sf_factory_security_filter'); 
    565         $securityFilter = sfSecurityFilter::newInstance($securityFilterClassName); 
    566         $securityFilter->initialize($this->context, $securityFilterParameters); 
    567         $filterChain->register($securityFilter); 
    568       } 
    569  
    570       $moduleName = $this->context->getModuleName(); 
    571  
    572       // register module/global filters 
    573       require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/filters.yml')); 
    574     } 
    575  
    576     if (sfConfig::get('sf_cache')) 
    577     { 
    578       // register cache filter 
    579       $cacheFilter = new sfCacheFilter(); 
    580       $cacheFilter->initialize($this->context); 
    581       $filterChain->register($cacheFilter); 
    582     } 
    583  
    584     // register common HTTP filter 
    585     $commonFilter = new sfCommonFilter(); 
    586     $commonFilter->initialize($this->context); 
    587     $filterChain->register($commonFilter); 
    588  
    589     if (sfConfig::get('sf_use_flash')) 
    590     { 
    591       // register flash filter 
    592       $flashFilter = new sfFlashFilter(); 
    593       $flashFilter->initialize($this->context); 
    594       $filterChain->register($flashFilter); 
    595     } 
    596  
    597     // register the execution filter 
    598     list($executionFilterClassName, $executionFilterParameters) = (array) sfConfig::get('sf_factory_execution_filter'); 
    599     if (!class_exists($executionFilterClassName)) 
    600     { 
    601       throw new sfConfigurationException(sprintf('Execution filter class "%s" does not exists', $executionFilterClassName)); 
    602     } 
    603     $execFilter = new $executionFilterClassName(); 
    604     $execFilter->initialize($this->context, $executionFilterParameters); 
    605     $filterChain->register($execFilter); 
     531    $moduleName = $this->context->getModuleName(); 
     532 
     533    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/filters.yml')); 
    606534  } 
    607535} 
  • trunk/lib/util/sfBrowser.class.php

    r2579 r2661  
    127127 
    128128    // we register a fake rendering filter 
    129     sfConfig::set('sf_factory_rendering_filter', array('sfFakeRenderingFilter', null)); 
     129    sfConfig::set('sf_rendering_filter', array('sfFakeRenderingFilter', null)); 
    130130 
    131131    // dispatch our request 
  • trunk/test/functional/fixtures/project/apps/backend/config/filters.yml

    r2217 r2661  
     1rendering: ~ 
     2web_debug: ~ 
     3security:  ~ 
     4 
     5# generally, you will want to insert your own filters here 
     6 
     7 
     8cache:     ~ 
     9common:    ~ 
     10flash:     ~ 
     11execution: ~ 
  • trunk/test/functional/fixtures/project/apps/cache/config/filters.yml

    r2169 r2661  
     1rendering: ~ 
     2web_debug: ~ 
     3security:  ~ 
     4 
     5# generally, you will want to insert your own filters here 
     6 
     7 
     8cache:     ~ 
     9common:    ~ 
     10flash:     ~ 
     11execution: ~ 
  • trunk/test/functional/fixtures/project/apps/crud/config/filters.yml

    r2126 r2661  
     1rendering: ~ 
     2web_debug: ~ 
     3security:  ~ 
     4 
     5# generally, you will want to insert your own filters here 
     6 
     7 
     8cache:     ~ 
     9common:    ~ 
     10flash:     ~ 
     11execution: ~ 
  • trunk/test/functional/fixtures/project/apps/frontend/config/filters.yml

    r2569 r2661  
     1rendering: ~ 
     2web_debug: ~ 
     3security:  ~ 
     4 
     5# generally, you will want to insert your own filters here 
    16myFilter: 
    27  class: myFilter 
     8 
     9 
     10cache:     ~ 
     11common:    ~ 
     12flash:     ~ 
     13execution: ~ 
  • trunk/test/functional/fixtures/project/apps/frontend/modules/configFiltersSimpleFilter/config/filters.yml

    r2069 r2661  
     1rendering: ~ 
     2web_debug: ~ 
     3security:  ~ 
     4 
     5# generally, you will want to insert your own filters here 
     6myFilter: 
     7  class: myFilter 
     8 
    19simpleFilter: 
    210  class: configFiltersSimpleFilterFilter 
     11 
     12 
     13cache:     ~ 
     14common:    ~ 
     15flash:     ~ 
     16execution: ~ 
  • trunk/test/unit/config/fixtures/sfFilterConfigHandler/default_filters.yml

    r2260 r2661  
    1 defaultFilter: 
     1execution: 
     2  class:  sfExecutionFilter 
     3  param: 
     4    type: execution 
     5 
     6default: 
    27  class: defaultFilterClass 
    38 
    4 anotherDefaultFilter: 
    5   class: anotherDefaultFilterClass 
     9rendering: 
     10  class:  sfRenderingFilter 
     11  param: 
     12    type: rendering 
  • trunk/test/unit/config/fixtures/sfFilterConfigHandler/filters.yml

    r2260 r2661  
    1 newFilter: 
     1execution: ~ 
     2default:   ~ 
     3 
     4new: 
    25  class: newFilterClass 
     6  param: 
     7    key: value 
    38 
    4 anotherDefaultFilter: 
    5   class: myAnotherDefaultFilterClass 
     9rendering: 
     10  param: 
     11    key: value 
  • trunk/test/unit/config/fixtures/sfFilterConfigHandler/result.php

    r2569 r2661  
    33//  
    44 
    5 $filter = new defaultFilterClass(); 
    6 $filter->initialize($this->context, null); 
     5list($class, $parameters) = (array) sfConfig::get('sf_execution_filter', array('sfExecutionFilter', array ( 
     6))); 
     7$filter = new $class(); 
     8$filter->initialize($this->context, $parameters); 
    79$filterChain->register($filter); 
    810 
    9 $filter = new myAnotherDefaultFilterClass(); 
    10 $filter->initialize($this->context, null); 
     11list($class, $parameters) = (array) sfConfig::get('sf_default_filter', array('defaultFilterClass', null)); 
     12$filter = new $class(); 
     13$filter->initialize($this->context, $parameters); 
    1114$filterChain->register($filter); 
    1215 
    13 $filter = new newFilterClass(); 
    14 $filter->initialize($this->context, null); 
     16list($class, $parameters) = (array) sfConfig::get('sf_new_filter', array('newFilterClass', array ( 
     17  'key' => 'value', 
     18))); 
     19$filter = new $class(); 
     20$filter->initialize($this->context, $parameters); 
    1521$filterChain->register($filter); 
    1622 
     23list($class, $parameters) = (array) sfConfig::get('sf_rendering_filter', array('sfRenderingFilter', array ( 
     24  'key' => 'value', 
     25))); 
     26$filter = new $class(); 
     27$filter->initialize($this->context, $parameters); 
     28$filterChain->register($filter); 
     29 
  • trunk/test/unit/config/sfFilterConfigHandlerTest.php

    r2276 r2661  
    1111require_once(dirname(__FILE__).'/../../bootstrap/unit.php'); 
    1212 
    13 $t = new lime_test(2, new lime_output_color()); 
     13$t = new lime_test(8, new lime_output_color()); 
    1414 
    1515$handler = new sfFilterConfigHandler(); 
     
    1818$dir = dirname(__FILE__).DIRECTORY_SEPARATOR.'fixtures'.DIRECTORY_SEPARATOR.'sfFilterConfigHandler'.DIRECTORY_SEPARATOR; 
    1919 
     20// parse errors 
    2021$t->diag('parse errors'); 
    2122$files = array( 
     
    3334} 
    3435 
     36// no execution/rendering filter 
     37foreach (array('execution', 'rendering') as $key) 
     38{ 
     39  $files = array( 
     40    $dir.sprintf('no_%s.yml', $key), 
     41  ); 
     42 
     43  try 
     44  { 
     45    $data = $handler->execute($files); 
     46    $t->fail(sprintf('filters.yml must have a filter of type "%s"', $key)); 
     47  } 
     48  catch (sfParseException $e) 
     49  { 
     50    $t->like($e->getMessage(), sprintf('/must register a filter of type "%s"/', $key), sprintf('filters.yml must have a filter of type "%s"', $key)); 
     51  } 
     52} 
     53 
     54// filter inheritance 
     55$t->diag('filter inheritance'); 
     56$files = array( 
     57  $dir.'default_filters.yml', 
     58  $dir.'not_disabled.yml', 
     59); 
     60 
     61try 
     62{ 
     63  $data = $handler->execute($files); 
     64  $t->fail('filters.yml must keep all filters when inheriting from a master filters configuration file'); 
     65} 
     66catch (sfConfigurationException $e) 
     67{ 
     68  $t->like($e->getMessage(), '/but not present/', 'filters.yml must keep all filters when inheriting from a master filters configuration file'); 
     69} 
     70 
     71// disabling a filter 
     72$t->diag('disabling a filter'); 
     73$files = array( 
     74  $dir.'disable.yml', 
     75); 
     76 
     77$t->unlike($handler->execute($files), '/defaultFilterClass/', 'you can disable a filter by settings "enabled" to false'); 
     78 
     79// condition support 
     80$t->diag('condition support'); 
     81$files = array( 
     82  $dir.'condition.yml', 
     83); 
     84 
     85sfConfig::set('default_test', true); 
     86$t->like($handler->execute($files), '/defaultFilterClass/', 'you can add a "condition" key to the filter parameters'); 
     87 
     88sfConfig::set('default_test', false); 
     89$t->unlike($handler->execute($files), '/defaultFilterClass/', 'you can add a "condition" key to the filter parameters'); 
     90 
     91// usual configuration 
     92$t->diag('usual configuration'); 
    3593$files = array( 
    3694  $dir.'default_filters.yml', 
     
    4098$data = $handler->execute($files); 
    4199$data = preg_replace('#date\: \d+/\d+/\d+ \d+\:\d+\:\d+#', '', $data); 
    42  
    43100$t->is($data, str_replace("\r\n", "\n", file_get_contents($dir.'result.php')), 'core filters.yml can be overriden');