Changeset 2661
- Timestamp:
- 11/13/06 11:43:43 (2 years ago)
- Files:
-
- trunk/data/config/factories.yml (modified) (1 diff)
- trunk/data/config/filters.yml (added)
- trunk/data/skeleton/app/app/config/filters.yml (modified) (1 diff)
- trunk/data/tasks/sfPakeUpgrade.php (modified) (4 diffs)
- trunk/lib/config/sfFactoryConfigHandler.class.php (modified) (2 diffs)
- trunk/lib/config/sfFilterConfigHandler.class.php (modified) (5 diffs)
- trunk/lib/controller/sfController.class.php (modified) (1 diff)
- trunk/lib/util/sfBrowser.class.php (modified) (1 diff)
- trunk/test/functional/fixtures/project/apps/backend/config/filters.yml (modified) (1 diff)
- trunk/test/functional/fixtures/project/apps/cache/config/filters.yml (modified) (1 diff)
- trunk/test/functional/fixtures/project/apps/crud/config/filters.yml (modified) (1 diff)
- trunk/test/functional/fixtures/project/apps/frontend/config/filters.yml (modified) (1 diff)
- trunk/test/functional/fixtures/project/apps/frontend/modules/configFiltersSimpleFilter/config/filters.yml (modified) (1 diff)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/condition.yml (added)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/default_filters.yml (modified) (1 diff)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/disable.yml (added)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/filters.yml (modified) (1 diff)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/no_execution.yml (added)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/no_rendering.yml (added)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/not_disabled.yml (added)
- trunk/test/unit/config/fixtures/sfFilterConfigHandler/result.php (modified) (1 diff)
- trunk/test/unit/config/sfFilterConfigHandlerTest.php (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/data/config/factories.yml
r1999 r2661 17 17 session_name: symfony 18 18 19 execution_filter:20 class: sfExecutionFilter21 22 rendering_filter:23 class: sfRenderingFilter24 25 security_filter:26 class: sfBasicSecurityFilter27 28 19 view_cache: 29 20 class: sfFileCache trunk/data/skeleton/app/app/config/filters.yml
r500 r2661 1 rendering: ~ 2 web_debug: ~ 3 security: ~ 4 5 # generally, you will want to insert your own filters here 6 7 cache: ~ 8 common: ~ 9 flash: ~ 10 execution: ~ trunk/data/tasks/sfPakeUpgrade.php
r2635 r2661 77 77 { 78 78 $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'))); 80 80 81 81 $app_dir = sfConfig::get('sf_apps_dir_name').'/'.$app; … … 83 83 // upgrade config.php 84 84 _upgrade_0_8_config_php($app_dir); 85 86 // upgrade filters.yml 87 _upgrade_0_8_filters_yml($app_dir); 85 88 86 89 // upgrade all modules … … 118 121 } 119 122 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'); 123 126 } 124 127 … … 369 372 } 370 373 374 function _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 371 422 function _upgrade_0_8_main_config_php() 372 423 { trunk/lib/config/sfFactoryConfigHandler.class.php
r2569 r2661 49 49 50 50 // 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'); 52 52 53 53 // let's do our fancy work … … 128 128 $inits[] = sprintf(" \$this->user->initialize(\$this, %s);", $parameters); 129 129 break; 130 131 case 'security_filter':132 // append creation/initialization in one swipe133 $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 name140 $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 name145 $inits[] = sprintf(" sfConfig::set('sf_factory_rendering_filter', array('%s', %s));", $class, $parameters);146 break;147 148 130 case 'view_cache': 149 131 // append view cache class name trunk/lib/config/sfFilterConfigHandler.class.php
r2569 r2661 34 34 { 35 35 // 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 } 37 58 38 59 // init our data and includes arrays … … 40 61 $includes = array(); 41 62 63 $execution = false; 64 $rendering = false; 65 42 66 // let's do our fancy work 43 67 foreach ($config as $category => $keys) 44 68 { 69 if (isset($keys['enabled']) && !$keys['enabled']) 70 { 71 continue; 72 } 73 45 74 if (!isset($keys['class'])) 46 75 { … … 64 93 // filter file doesn't exist 65 94 $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $class, $file); 95 66 96 throw new sfParseException($error); 67 97 } … … 71 101 } 72 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 73 113 // parse parameters 74 $parameters = (isset($keys['param']) ? var_export($keys['param'], true) : 'null');114 $parameters = isset($keys['param']) ? var_export($keys['param'], true) : 'null'; 75 115 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); 81 152 } 82 153 … … 89 160 return $retval; 90 161 } 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? 177 if (\$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)} 91 185 } 186 EOF; 187 } 188 } trunk/lib/controller/sfController.class.php
r2569 r2661 529 529 public function loadFilters($filterChain, $actionInstance) 530 530 { 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')); 606 534 } 607 535 } trunk/lib/util/sfBrowser.class.php
r2579 r2661 127 127 128 128 // 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)); 130 130 131 131 // dispatch our request trunk/test/functional/fixtures/project/apps/backend/config/filters.yml
r2217 r2661 1 rendering: ~ 2 web_debug: ~ 3 security: ~ 4 5 # generally, you will want to insert your own filters here 6 7 8 cache: ~ 9 common: ~ 10 flash: ~ 11 execution: ~ trunk/test/functional/fixtures/project/apps/cache/config/filters.yml
r2169 r2661 1 rendering: ~ 2 web_debug: ~ 3 security: ~ 4 5 # generally, you will want to insert your own filters here 6 7 8 cache: ~ 9 common: ~ 10 flash: ~ 11 execution: ~ trunk/test/functional/fixtures/project/apps/crud/config/filters.yml
r2126 r2661 1 rendering: ~ 2 web_debug: ~ 3 security: ~ 4 5 # generally, you will want to insert your own filters here 6 7 8 cache: ~ 9 common: ~ 10 flash: ~ 11 execution: ~ trunk/test/functional/fixtures/project/apps/frontend/config/filters.yml
r2569 r2661 1 rendering: ~ 2 web_debug: ~ 3 security: ~ 4 5 # generally, you will want to insert your own filters here 1 6 myFilter: 2 7 class: myFilter 8 9 10 cache: ~ 11 common: ~ 12 flash: ~ 13 execution: ~ trunk/test/functional/fixtures/project/apps/frontend/modules/configFiltersSimpleFilter/config/filters.yml
r2069 r2661 1 rendering: ~ 2 web_debug: ~ 3 security: ~ 4 5 # generally, you will want to insert your own filters here 6 myFilter: 7 class: myFilter 8 1 9 simpleFilter: 2 10 class: configFiltersSimpleFilterFilter 11 12 13 cache: ~ 14 common: ~ 15 flash: ~ 16 execution: ~ trunk/test/unit/config/fixtures/sfFilterConfigHandler/default_filters.yml
r2260 r2661 1 defaultFilter: 1 execution: 2 class: sfExecutionFilter 3 param: 4 type: execution 5 6 default: 2 7 class: defaultFilterClass 3 8 4 anotherDefaultFilter: 5 class: anotherDefaultFilterClass 9 rendering: 10 class: sfRenderingFilter 11 param: 12 type: rendering trunk/test/unit/config/fixtures/sfFilterConfigHandler/filters.yml
r2260 r2661 1 newFilter: 1 execution: ~ 2 default: ~ 3 4 new: 2 5 class: newFilterClass 6 param: 7 key: value 3 8 4 anotherDefaultFilter: 5 class: myAnotherDefaultFilterClass 9 rendering: 10 param: 11 key: value trunk/test/unit/config/fixtures/sfFilterConfigHandler/result.php
r2569 r2661 3 3 // 4 4 5 $filter = new defaultFilterClass(); 6 $filter->initialize($this->context, null); 5 list($class, $parameters) = (array) sfConfig::get('sf_execution_filter', array('sfExecutionFilter', array ( 6 ))); 7 $filter = new $class(); 8 $filter->initialize($this->context, $parameters); 7 9 $filterChain->register($filter); 8 10 9 $filter = new myAnotherDefaultFilterClass(); 10 $filter->initialize($this->context, null); 11 list($class, $parameters) = (array) sfConfig::get('sf_default_filter', array('defaultFilterClass', null)); 12 $filter = new $class(); 13 $filter->initialize($this->context, $parameters); 11 14 $filterChain->register($filter); 12 15 13 $filter = new newFilterClass(); 14 $filter->initialize($this->context, null); 16 list($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); 15 21 $filterChain->register($filter); 16 22 23 list($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 11 11 require_once(dirname(__FILE__).'/../../bootstrap/unit.php'); 12 12 13 $t = new lime_test( 2, new lime_output_color());13 $t = new lime_test(8, new lime_output_color()); 14 14 15 15 $handler = new sfFilterConfigHandler(); … … 18 18 $dir = dirname(__FILE__).DIRECTORY_SEPARATOR.'fixtures'.DIRECTORY_SEPARATOR.'sfFilterConfigHandler'.DIRECTORY_SEPARATOR; 19 19 20 // parse errors 20 21 $t->diag('parse errors'); 21 22 $files = array( … … 33 34 } 34 35 36 // no execution/rendering filter 37 foreach (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 61 try 62 { 63 $data = $handler->execute($files); 64 $t->fail('filters.yml must keep all filters when inheriting from a master filters configuration file'); 65 } 66 catch (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 85 sfConfig::set('default_test', true); 86 $t->like($handler->execute($files), '/defaultFilterClass/', 'you can add a "condition" key to the filter parameters'); 87 88 sfConfig::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'); 35 93 $files = array( 36 94 $dir.'default_filters.yml', … … 40 98 $data = $handler->execute($files); 41 99 $data = preg_replace('#date\: \d+/\d+/\d+ \d+\:\d+\:\d+#', '', $data); 42 43 100 $t->is($data, str_replace("\r\n", "\n", file_get_contents($dir.'result.php')), 'core filters.yml can be overriden');