不带控制器的模块配置ZF2
我目前正在构建一个模块,以便在多个项目中充当可重用库,但由于它是一个库,因此不需要控制器。 例如,我想要为Marketo soap API创建一个zf2模块。 用户将其密钥和wsdl位置添加到/ROOT/config/autoload/local.php中。 配置会包含诸如'marketo'=> array()之类的东西,
现在我遇到的问题是我想给自己和其他人使用该模块的能力来做类似......
$marketo = new MarketoClientClient();
并且在 Marketo Client Client()类中有构造函数读取$ config ['marketo']的数组键;
然而,我可以将所有这些放在一个ini文件中,但我更愿意保持它与zf2中的其他所有配置明智相似。
所以总结一下,我希望得到一个合并的zend配置的数组键,在类内使用类似...
class Marketo{
private $key;
private $pass;
public function __construct(){
$c = ZendConfigConfig('marketo);
$this->key = $c['key'];
$this->pass = $c['pass'];
}
}
============完全可行的解决方案,截至ZF 2.1.1,每个答案如下=============
模块结构如下所示(使用新的示例,以便我可以重新开始)+表示目录名称 - 表示文件名
modules
- Application /* Standard setup with an IndexController */
- Cybersource /* The new module to be added */
+ config
- module.config.php
+ src
+ Cybersource
+ Client
- Client.php
+ ServiceFactory
- ClientServiceFactory.php
- Module.php
- autoload_classmap.php
module.config.php
return array(
'service_manager' => array(
'factories' => array(
'CybersourceClientClient' => 'CybersourceServiceFactoryClientServiceFactory',
)
),
'cybersource' => array(
'Endpoint' => 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor', // test environment
'WSDL' => 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.80.wsdl',
'TXKey' => '',
'MerchID' => '',
),
);
Client.php
namespace CybersourceClient;
class Client {
private $config;
public function __construct($config) {
$this->config = $config;
}
public function getConfig() {
return $this->config;
}
}
ClientServiceFactory.php
namespace CybersourceServiceFactory;
use CybersourceClientClient;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
class ClientServiceFactory implements FactoryInterface {
public function createService(ServiceLocatorInterface $serviceLocator) {
$config = $serviceLocator->get('Config');
return new Client($config['cybersource']);
}
}
Module.php
namespace Cybersource;
use ZendModuleManagerFeatureConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getAutoloaderConfig() {
return array(
'ZendLoaderClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
)
);
}
public function getConfig() {
return include __DIR__ . '/config/module.config.php';
}
}
autoload_classmap.php
<?php
// Generated by ZF2's ./bin/classmap_generator.php
return array(
'CybersourceModule' => __DIR__ . '/Module.php',
'CybersourceClientClient' => __DIR__ . '/src/Cybersource/Client/Client.php',
'CybersourceServiceFactoryClientServiceFactory' => __DIR__ . '/src/ServiceFactory/ClientServiceFactory.php',
);
一旦模块在application.config.php中被激活,我就可以在我的应用程序模块的IndexController中使用它,方法是:
<?php
namespace ApplicationController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
class IndexController extends AbstractActionController {
public function indexAction() {
$c = $this->getServiceLocator()->get('CybersourceClientClient');
$conf = $c->getConfig();
var_dump($conf);
return new ViewModel();
}
}
上面的控制器输出会转储配置的输出,因为我为了显示/测试的目的而将一个名为getConfig()的函数添加到Client类。
再次感谢所有的帮助。
你可能会定义一个模块,如下所示:
<?php
namespace Marketo;
use ZendModuleManagerFeatureConfigProviderInterface;
class Module implements ConfigProviderInterface
{
public function getConfig()
{
return array(
'service_manager' => array(
'factories' => array(
'MarketoClientClient' => 'MarketoServiceFactoryClientServiceFactory',
),
),
'marketo' => array(
'key' => 'DEFAULT',
'pass' => 'DEFAULT',
),
);
}
}
注意:我更喜欢使用getConfig
不是getServiceConfig
因为它更灵活(可覆盖),并且在设置应用程序时缓存方法调用。
然后MarketoServiceFactoryClientServiceFactory
:
<?php
namespace MarketoServiceFactory;
use MarketoClientClient;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
class ClientServiceFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$config = $serviceLocator->get('Config');
return new Client($config['marketo']['key'], $value['marketo']['pass']);
}
}
之后,您可以通过调用以下内容(例如在控制器中)从服务定位器中拉取Marketo客户端:
$marketoClient = $this->getServiceLocator()->get('MarketoClientClient');
此时,您的MarketoClientClient
无论如何都是使用key
构建的, pass
其设置为DEFAULT
。
让我们继续并通过创建一个config/autoload/marketo.local.php
文件来覆盖它(在您的应用程序根目录中,而不是在模块中):
<?php
return array(
'marketo' => array(
'key' => 'MarketoAdmin',
'pass' => 'Pa$$w0rd',
),
);
这是非常重要的,因为你永远不应该重新分配你的key
和pass
,所以把这个文件放入.gitignore
或svn:ignore
!
所以基本上我们在这里做的是:
'config'
)来实例化Marketo客户端 您应该定义一个ServiceFactory
来创建您的Client
。 ServiceFactory可以获取合并的模块配置并将其设置在客户端上。 你现在有了清晰的分离,而且你的课程甚至可以在没有Zend Config的情况下重用。 如果你有很多配置选项,你可以创建一个独立的配置类来扩展ZendStdLibAbstractOptions
并把它传递给你的客户端。
namespace MarketoService;
class ClientServiceFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
//Get the merged config of all modules
$configuration = $serviceLocator->get('Config');
$configuration = $configuration['marketo'];
$client = new MarketoClientClient($configuration['key'], $configuration['pass']);
}
}
现在在服务定位器中注册您的客户端工厂。 在module.config.php
或Module.php
执行此Module.php
public function getServiceConfig()
{
return array('factories' => array(
'marketo_client' => 'MarketoServiceClientServiceFactory'
);
}
用户现在可以从ServiceManager获取您的客户端。 所有配置都整齐地设置。
$sm->get('marketo_client');
链接地址: http://www.djcxy.com/p/67779.html
上一篇: ZF2 config from module with no controllers
下一篇: Best way to load module/class from lib folder in Rails 3?