mxc-commons/mxc-generics

Zend Framework 2 模块,提供一些有用的基本资源,便于重用和便利。

v0.2.0 2014-01-30 18:31 UTC

This package is auto-updated.

Last update: 2024-08-29 04:16:51 UTC


README

版本 0.1.0 由 Frank Hein 和 mxc-commons 团队创建。

MxcGenerics 是德国 maxence business consulting gmbh 的 maxence 开源计划的一部分。

简介

MxcGenerics 提供我们在开发中使用的通用类和资源。maxence 的其他模块依赖于 MxcGenerics。

特性 / 目标

MxcGenerics 的主要设计目标是封装常用通用功能。

要求

安装

主要设置

通过克隆项目

  1. 将此项目克隆到您的 ./vendor/ 目录中。

使用 composer

  1. 在您的 composer.json 中添加此项目

    "require": {
        "mxc-commons/mxc-generics": "dev-master"
    }
  2. 现在运行以下命令让 composer 下载 MxcGenerics:

    $ php composer.phar update

安装后

  1. 在您的 application.config.php 文件中启用它。

    <?php
    return array(
        'modules' => array(
            // ...
            'MxcGenerics',
        ),
        // ...
    );

包内容

目录:表单

EventProviderForm

从 Zend\Form\Form 派生的类,能够触发事件。

EventForm

从 EventProviderForm 派生的类,发出 EVENT_PRE_BIND、EVENT_PRE_PREPARE 和 EVENT_PRE_VALIDATE 事件。

目录:会话

SessionManagerFactory

创建 Zend\Session\SessionManager 的类。可以通过 'session' 配置键提供配置选项。

目录:Stdlib

GenericRegistry

GenericRegistry 类与 Zend\Stdlib\AbstractOptions 相似。它利用魔术函数为每个值模拟一个设置器和获取器。内部数据存储在关联数组中。

$registry = new GenericRegistry();
$registry->setKneel(72);
$registry->setPray(42);

echo $registry->getKneel();
echo $registry->getPray();

output: 72 42
GenericOptions

GenericOptions 是从 GenericRegistry 派生的类。在构造时,它期望一个结构如下所示的数组:

$myOptions => array(
   'options' => array(
       'set1' => array(
           'value1' => 10,
           'value2' => 20,
			...
		),
		'set2' => array(
			'value1' => 32,
		),
	),
	'defaults' => array(
		'value1' => 1,
		'value2' => 2,
	),
);

在构造时,GenericOptions 使用默认部分的值进行初始化。如果指定了(可选的)选项集,则这些选项集将在之后应用,并扩展/覆盖默认选项。

 $options = new GenericOptions($myOptions); 
 echo $options->getValue1();	//-- output 1
 echo $options->getValue2();	//-- output 2   

 $options = new GenericOptions($myOptions, 'set1'); 
 echo $options->getValue1();	//-- output 10
 echo $options->getValue2();	//-- output 20   

 $options = new GenericOptions($myOptions, 'set2'); 
 echo $options->getValue1();	//-- output 32
 echo $options->getValue2();	//-- output 2   
StringHelper

字符串辅助函数集合。目前该类包含一个静态成员。formatVarExport 的目的是使数组 var_export 输出看起来更美观。

目录:Stdlib\Hydrator

ClassMethods

从 Zend\Stdlib\Hydrator\ClassMethods 派生的 hydrator。根据与其他 hydrator 的行为兼容性原因,覆盖了 __construct() 参数的默认值。

目录:ServiceManager

GenericPluginManager

从 Zend\ServiceManager\AbstractPluginManager 派生的类。将插件与一组 GenericOptions 关联。

 'my_plugin_options' => array(
     'plugin1' => array(
		 //-- see GenericOptions above
	 ),
     'plugin2' => array(
		//-- see GenericOptions above
	 )
 ),
 'my_plugins' => array(
	'invobables' => array(
		'plugin1' => 'My\Namespace\MyClass1',
		'plugin2' => 'My\Namespace\MyClass2',
	),
 ),
GenericPluginManagerFactory

从 Zend\Mvc\Service\AbstractPluginManagerFactory 派生的类。将设置选项应用于 GenericPluginManager。

如果您从 GenericPluginManager 派生了一个插件管理器并将其注册到应用程序的 onInit 中,您将像这样实现您的类工厂

class FirewallManagerFactory extends GenericPluginManagerFactory {

    const PLUGIN_MANAGER_CLASS = 'MxcFirewall\FirewallManager\FirewallManager';    
    
    /**
	 * @see \Zend\ServiceManager\FactoryInterface::createService()
	 */
	public function createService(ServiceLocatorInterface $serviceLocator) {
	    $config = $serviceLocator->get('Configuration');
	    $this->setup = array(
	       'plugin_options'    => 'firewall-options',
        );
	    $plugins = parent::createService($serviceLocator);
	    
	    return $plugins;    
	}
}	 

如果您想创建一个不带全局注册的插件管理器,您将创建一个类似这样的工厂(ListenerManager 是此示例中从 GenericPluginManager 派生的类)

class ListenerManagerFactory implements FactoryInterface {

    /* 
	 * @see \Zend\ServiceManager\FactoryInterface::createService()
	 */
	public function createService(ServiceLocatorInterface $serviceLocator) {
	    $config = $serviceLocator->get('Configuration');
	    $config = isset($config['firewall-listeners']) ? $config['firewall-listeners'] : null;
	    $config = new Config($config);
	    $plugins = new ListenerManager($config); 
	    $plugins->setup(array('plugin_options' => 'firewall-listener-options'));
	    return $plugins;
	}
}

目录:ServiceManager/Plugin

AbstractPlugin

AbstractPlugin 是由 GenericPluginManager 维护的所有插件的基础类。派生的 PluginManagers 应根据您从 AbstractPlugin 派生的特定服务类覆盖 GenericPluginManager::isValid()

AbstractPlugin 通过 GenericPluginManager 处理服务选项设置。

此外,AbstractPlugin 提供了一个通用的辅助函数 translateVars,用于替换选项值中的字符串。派生类应根据其需要重写 getVars()

public function getRootDirectory() {
	return 'C:\';
}

public function getVars() {
	return array(
		'%rootDirectory% => $this->getRootDirectory(),
		'%myOtherReplacement% => 'test',
	);
}

$value1 = '%rootDirectory%' . 'temp';
$value2 = '%myOtherReplacement%' . 'ing';
$value3 = 'myOption';

echo $this->translateVars($value1); //-- output: 'C:\temp'
echo $this->translateVars($value2); //-- output: 'testing'
echo $this->translateVars($value3); //-- output: 'myOption';
AbstractGenerator

示例类演示了如何实现一个插件,该插件允许通过参数覆盖特定方法的运行时选项。

abstract class AbstractGenerator extends AbstractPlugin {
    
    protected $optionStack;
    
	public function generate($params, $options = null) {
        $this->getOptionStack()->push($this->options);
	    $this->options = $this->getActualOptions($params, $options);
	     
	    $result = $this->doGenerate($this->options);
	    $reset = $this->options->getResetOptionsAfterRun();
	    $this->options = $this->optionStack->pop();
	    if ($reset) $this->resetOptions();
	    return $result;	    
	}
	
	public function doGenerate($options) {
	    //abstract
	}
	
    protected function getOptionStack() {
        if (!$this->optionStack) {
            $this->optionStack = new SplStack();
        }
        return $this->optionStack;
    }
    
    public function resetOptions() {
        parent::resetOptions();
        $this->optionStack = new SplStack();
    }
}

我们在这里使用 SplStack 栈来保存当前选项。然后,参数与选项合并,从而覆盖/扩展它们。使用合并后的选项集调用 doGenerate。之后,从栈中恢复原始选项。

如果插件选项包含值为 truereset_options_after_run,则插件将恢复到默认设置,并清空选项栈。

致谢

我们在许多模块中看到了类似 EventProviderForm 的东西。

许可证

MxcGenerics 在 New BSD 许可证下发布。请参阅 license.txt