Zend_Filter_Inflector
例如,你可能发现你需要把混合大小写字(MixedCase)或驼峰字符( camelCasedWords) 变成路径,对于可读性,OS 策略或其它原因, 你也需要把它变成小写,并且你想用短横线('-')来隔离单词。变形器(inflector)可以帮你做这些。
Example #1 把混合大小写字(MixedCase)和驼峰字符 (camelCaseText) 变成其它格式 <?php $inflector = new Zend_Filter_Inflector('pages/:page.:suffix'); $inflector->setRules(array( ':page' => array('Word_CamelCaseToDash', 'StringToLower'), 'suffix' => 'html' )); $string = 'camelCasedWords'; $filtered = $inflector->filter(array('page' => $string)); // pages/camel-cased-words.html $string = 'this_is_not_camel_cased'; $filtered = $inflector->filter(array('page' => $string)); // pages/this_is_not_camel_cased.html ?> 操作
变形器要求 target 和一个或多个 rules。
目标基本上是个字符串,它为你想替换的变量定义了占位符。
这些由带有':'的前缀来指定:
当调用
在目标中的每个变量可以有零到多个规则。规则可以是 静态的 或指向
例如,你可以使用 设置到预备的过滤器的路径
<?php // use Zend_Filter_Word_CamelCaseToDash as a rule $inflector->addRules(array('script' => 'Word_CamelCaseToDash')); ?>
要设置备用的路径, <?php $inflector->addFilterPrefixPath('My_Filter', 'My/Filter/'); ?> 另外,你可以从变形器获取插件加载器并和它直接互动: <?php $loader = $inflector->getPluginLoader(); $loader->addPrefixPath('My_Filter', 'My/Filter/'); ?> 更多关于修改过滤器路径的选项,请参考 插件加载器文档 。 设置变形器目标
变形器目标是一个带有一些变量的占位符的字符串。
占位符表现为识别器的形式,缺省为冒号(':'),紧跟着变量名:':script'、 ':path'等。
可用使用 <?php // Via constructor: $inflector = new Zend_Filter_Inflector('#foo/#bar.#sfx', null, '#'); // Via accessor: $inflector->setTargetReplacementIdentifier('#'); ?>
一般地,通过构造器来设置目标。然而,你想在稍后重置目标(例如,在核心部件里修改缺省变形器,如 <?php $inflector = $layout->getInflector(); $inflector->setTarget('layouts/:script.phtml'); ?>
另外,你可能希望在你的类中有类成员,类用来保持变形器目标是最新的 - 不需要每次直接更新目标
(这样节省调用方法)。 <?php class Foo { /** * @var string Inflector target */ protected $_target = 'foo/:bar/:baz.:suffix'; /** * Constructor * @return void */ public function __construct() { $this->_inflector = new Zend_Filter_Inflector(); $this->_inflector->setTargetReference($this->_target); } /** * Set target; updates target in inflector * * @param string $target * @return Foo */ public function setTarget($target) { $this->_target = $target; return $this; } } ?> 变形规则如在简介中所提到的,有两种类型的规则:静态的和基于过滤器的。
静态规则
静态规则做简单的字符替换,当在静态目标里有片段,但你想让开发者修改的时候使用它们。
使用 <?php $inflector = new Zend_Filter_Inflector(':script.:suffix'); $inflector->setStaticRule('suffix', 'phtml'); // change it later: $inflector->setStaticRule('suffix', 'php'); ?>
很像目标自己,你也可以绑定静态规则到一个引用,让你来更新单个变量而不是请求一个方法调用。
当你的类在内部使用变形器,并且你不想让用户为更新而抓取变形器,这通常很有用,
<?php class Foo { /** * @var string Suffix */ protected $_suffix = 'phtml'; /** * Constructor * @return void */ public function __construct() { $this->_inflector = new Zend_Filter_Inflector(':script.:suffix'); $this->_inflector->setStaticRuleReference('suffix', $this->_suffix); } /** * Set suffix; updates suffix static rule in inflector * * @param string $suffix * @return Foo */ public function setSuffix($suffix) { $this->_suffix = $suffix; return $this; } } ?> 过滤变形器规则
规则可以用
<?php $inflector = new Zend_Filter_Inflector(':script.:suffix'); // Set rule to use Zend_Filter_Word_CamelCaseToDash filter $inflector->setFilterRule('script', 'Word_CamelCaseToDash'); // Add rule to lowercase string $inflector->addFilterRule('script', new Zend_Filter_StringToLower()); // Set rules en-masse $inflector->setFilterRule('script', array( 'Word_CamelCaseToDash', new Zend_Filter_StringToLower() )); ?> 一次设置多个规则
一般地,一次设置多个规则比每次配置一个单个的变量和它的变形器规则要容易。
每个方法带有一个变量/规则对的数组,这里规则是接受的任何规则(字符串、过滤器对象或数组)。 变量名接受一个特殊的符号来允许设置静态规则和过滤器规则,符号有:
Example #2 一次设置多重规则 <?php // Could also use setRules() with this notation: $inflector->addRules(array( // filter rules: ':controller' => array('CamelCaseToUnderscore','StringToLower'), ':action' => array('CamelCaseToUnderscore','StringToLower'), // Static rule: 'suffix' => 'phtml' )); ?> 实用方法
对 Zend_Filter_Inflector 使用 Zend_Config
你可以通过传递
Example #3 使用 Zend_Config with Zend_Filter_Inflector <?php // With the constructor: $config = new Zend_Config($options); $inflector = new Zend_Filter_Inflector($config); // Or with setConfig(): $inflector = new Zend_Filter_Inflector(); $inflector->setConfig($config); ?>
|