使用symfony的配置缓ob娱乐下载存
注意,config数组是在代码生成时而不是在运行时检查某些键的。这将提供一个小的性能提升。
提示
作为一般规则,检查配置条件的逻辑应该在配置处理程序中运行,而不是在生成的代码中运行。检查运行时条件的逻辑(比如被增强的表单对象的性质)必须在运行时运行。
生成的代码放置在类定义中,然后保存到缓存目录。
类sfFormYamlEnhancementsConfigHandler扩展sfYamlConfigHandler{公共函数执行(configfile美元){美元的形式= self::getConfiguration(configfile美元);美元的代码=数组();美元的代码[]=' < ?php的;美元的代码[]='//自动生成'.__CLASS__进行;美元的代码[]='// date: '.日期(“Y / m / d H:”);美元的代码[]=“阶级sfFormYamlEnhancementsWorker”;美元的代码[]=“{”;美元的代码[]=' static public $enhancable = '.var_export(中的(美元的形式),真正的).“;”;foreach(美元的形式作为美元的类= >美元的字段){美元的代码[]=“静态公共功能增强”.美元的类.“(sfFormFieldSchema字段)美元”;美元的代码[]=“{”;美元的代码[]=' '.这个美元->getEnhancerCode(美元的字段);美元的代码[]=“}”;}美元的代码[]=“}”;返回内爆(PHP_EOL,美元的代码);}/ /……}
的sfFormYamlEnhancer
类现在将服从生成的工作类来处理表单对象的操作,但现在必须考虑通过嵌入表单的递归。为此,我们必须并行处理表单的字段模式(可以通过递归迭代)和表单对象(包括嵌入的表单)。
类sfFormYamlEnhancer{/ /……公共函数增强(sfForm美元的形式){require_once这个美元->configCache->checkConfig(“配置/ forms.yml”);这个美元->doEnhance(美元的形式->getFormFieldSchema(),美元的形式);}受保护的函数doEnhance(sfFormFieldSchemafieldSchema美元, sfForm美元的形式){如果(美元增强剂=这个美元->getEnhancer(get_class(美元的形式))){call_user_func(美元增强剂,fieldSchema美元);}foreach(美元的形式->getEmbeddedForms()作为美元的名字= >美元的形式){如果(收取(fieldSchema美元[美元的名字])){这个美元->doEnhance(fieldSchema美元[美元的名字],美元的形式);}}}公共函数getEnhancer(美元的类){如果(in_array(美元的类, sfFormYamlEnhancementsWorker::enhancable美元)){返回数组(“sfFormYamlEnhancementsWorker”,“增强”.美元的类);}其他的如果(美元的重叠=array_intersect(class_parents(美元的类), sfFormYamlEnhancementsWorker::enhancable美元)){返回数组(“sfFormYamlEnhancementsWorker”,“增强”.当前的(美元的重叠));}}}
请注意
嵌入表单对象上的字段在嵌入后不应该被修改。嵌入式表单存储在父表单中用于处理目的,但对父表单的呈现方式没有影响。
有了对嵌入式表单的支持,我们的测试现在应该可以通过了。运行脚本找出答案:
我们做得怎么样?
让我们运行一些基准测试,以确保我们没有浪费时间。为了使结果更有趣,可以添加更多的表单类forms.yml
使用PHP循环。
# < ?php为(我美元=0;$i < 100;$i++): ?> #表单: ~ # #
通过运行下面的代码片段创建所有这些类:
mkdir(dir美元= sfConfig::得到(“sf_lib_dir”).“/形式/ test_fixtures”);为(我美元=0;我美元<One hundred.;我美元++){写入(dir美元.' /形式'.我美元.“.class.php”,' < ?php类Form'.我美元.extends BaseForm {});}
现在我们准备运行一些基准测试。为了得到下面的结果,我运行了以下程序Apache在我的MacBook上多次执行命令,直到我得到小于2毫秒的标准偏差。
$ ab -t 60 -n 20 http://localhost/config_cache/web/index.php
从一个基线基准开始,在完全不连接增强器的情况下运行应用程序。注释掉sfFormYamlEnhancer
在frontendConfiguration
并运行基准测试:
Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 62 63 1.5 63 69 Waiting: 62 63 1.5 63 69 Total: 62 63 1.5 63 69
接下来,粘贴的第一个版本sfFormYamlEnhancer:提高()
,被称为sfYaml
直接进入类并运行基准测试:
Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 87 88 1.6 88 93 Waiting: 87 88 1.6 88 93 Total: 87 88 1.7 88 94
您可以看到,我们为每个请求平均增加了25毫秒,几乎增加了40%。接下来,撤消刚才对- >加强()
因此,我们的自定义配置处理程序将恢复并再次运行基准测试:
Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 62 63 1.6 63 70 Waiting: 62 63 1.6 63 70 Total: 62 64 1.6 63 70
如您所见,通过创建自定义配置处理程序,我们将处理时间减少到基线。
只是为了好玩:捆绑一个插件
现在我们已经有了这个很棒的系统,可以用一个简单的YAML配置文件来增强表单对象,为什么不把它捆绑成一个插件并与社区共享呢?欧宝体育平台怎么样对于那些过去没有发布过插件的人来说,这听起来可能有点吓人;希望我们现在可以消除一些恐惧。
这个插件的文件结构如下:
sfFormYamlEnhancementsPlugin/ config/ sfFormYamlEnhancementsPluginConfiguration.class.php lib/ config/ sfFormYamlEnhancementsConfigHandler.class.php form/ sfFormYamlEnhancer.class.php test/ unit/ form/ sfFormYamlEnhancerTest.php
我们需要做一些修改来简化插件安装过程。增强器对象的创建和连接可以封装在插件配置类中:
类sfFormYamlEnhancementsPluginConfiguration扩展sfPluginConfiguration{公共函数初始化(){如果(这个美元->配置instanceof sfApplicationConfiguration){美元增强剂=新sfFormYamlEnhancer(这个美元->配置->getConfigCache());美元增强剂->连接(这个美元->调度程序);}}}
测试脚本将需要更新以引用项目的引导脚本:
包括目录名(__FILE__).'/../../../../../ 测试/引导/ unit.php ';/ /……
最后,启用插件ProjectConfiguration
:
类ProjectConfiguration扩展sfProjectConfiguration{公共函数设置(){这个美元->enablePlugins(“sfFormYamlEnhancementsPlugin”);}}
如果您想从插件运行测试,请将它们连接进来ProjectConfiguration
现在:
类ProjectConfiguration扩展sfProjectConfiguration{/ /……公共函数setupPlugins(){这个美元->pluginConfigurations[“sfFormYamlEnhancementsPlugin”]->connectTests();}}
现在插件中的测试将在您调用任何测试:*
任务。
类sfFormYamlEnhancer{/ /……公共函数增强(sfForm美元的形式){这个美元->loadWorker();这个美元->doEnhance(美元的形式->getFormFieldSchema(),美元的形式);}公共函数loadWorker(){require_once这个美元->configCache->checkConfig(“配置/ forms.yml”);}/ /……}
然后我们可以重载- > loadWorker ()
方法直接调用自定义配置处理程序。的CommentForm
类也应该移动到测试脚本和forms.yml
文件移动到插件的测试/夹具
目录中。
包括目录名(__FILE__).'/../../../../../ 测试/引导/ unit.php ';$ t=新lime_test(6);类sfFormYamlEnhancerTest扩展sfFormYamlEnhancer{公共函数loadWorker(){如果(!class_exists(“sfFormYamlEnhancementsWorker”,假)){configHandler美元=新sfFormYamlEnhancementsConfigHandler();美元的代码=configHandler美元->执行(数组(目录名(__FILE__).“/ . . / . . /夹具/ forms.yml”));美元的文件=tempnam(sys_get_temp_dir(),“sfFormYamlEnhancementsWorker”);写入(美元的文件,美元的代码);需要美元的文件;}}}类CommentForm扩展标识{公共函数配置(){这个美元->setWidget(“身体”,新sfWidgetFormTextarea());这个美元->setValidator(“身体”,新sfValidatorString(数组(“min_length”= >12)));}}美元配置=美元配置->getApplicationConfiguration(“前端”,“测试”,真正的,零,美元配置->getEventDispatcher());美元增强剂=新sfFormYamlEnhancerTest(美元配置->getConfigCache());/ /……
最后,对插件进行打包也很容易sfTaskExtraPlugin
安装。只需运行插件:包
任务和包将在一些交互式提示后创建。
$ php ob娱乐下载symfony插件:package sfFormYamlEnhancementsPlugin
请注意
本文中的代码已作为插件发布,可从symfony plugins站点下载:ob娱乐下载
http://ob娱乐下载symfony-project.org/plugins/sfFormYamlEnhancementsPlugin
这个插件包括了我们在这里介绍的内容以及更多内容,包括对widgets.yml
而且validators.yml
文件以及集成i18n:提取
任务,使您的表单易于国际化。
最终的想法
从这里的基准测试可以看出,symfony配置缓存可以利用YAML配置文件的简单性,而对性能几乎没ob娱乐下载有影响。
本作品在创作共用署名相似共享3.0未移植许可许可下获得许可。