我目前正在构建一个模块以在多个项目中用作可重用库,但是由于它是一个库,因此不需要控制器。例如,我正在尝试为 Marketo soap API 创建一个 zf2 模块。用户在 /ROOT/config/autoload/local.php 中添加他们的密钥和 wsdl 位置。配置将包括类似'marketo'=>array(),
现在我遇到的问题是我想让自己和使用该模块的其他人能够执行类似...
$marketo = new \Marketo\Client\Client();
并在 \Marketo\Client\Client() 类中让构造函数读取 $config['marketo']; 的数组键;
然而,我可以将所有这些都放在一个 ini 文件中,但我更愿意让它与 zf2 中的其他所有内容在配置方面保持相似。
所以总结一下,我想获得一个合并的zend配置的数组键,以便在类中使用,比如......
class Marketo{
private $key;
private $pass;
public function __construct(){
$c = \Zend\Config\Config('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
模块.config.php
return array(
'service_manager' => array(
'factories' => array(
'Cybersource\Client\Client' => 'Cybersource\ServiceFactory\ClientServiceFactory',
)
),
'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' => '',
),
);
客户端.php
namespace Cybersource\Client;
class Client {
private $config;
public function __construct($config) {
$this->config = $config;
}
public function getConfig() {
return $this->config;
}
}
客户端服务工厂.php
namespace Cybersource\ServiceFactory;
use Cybersource\Client\Client;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class ClientServiceFactory implements FactoryInterface {
public function createService(ServiceLocatorInterface $serviceLocator) {
$config = $serviceLocator->get('Config');
return new Client($config['cybersource']);
}
}
模块.php
namespace Cybersource;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getAutoloaderConfig() {
return array(
'Zend\Loader\ClassMapAutoloader' => 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(
'Cybersource\Module' => __DIR__ . '/Module.php',
'Cybersource\Client\Client' => __DIR__ . '/src/Cybersource/Client/Client.php',
'Cybersource\ServiceFactory\ClientServiceFactory' => __DIR__ . '/src/ServiceFactory/ClientServiceFactory.php',
);
在 application.config.php 中激活模块后,我可以在我的应用程序模块上的 IndexController 中使用它,方法是:
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class IndexController extends AbstractActionController {
public function indexAction() {
$c = $this->getServiceLocator()->get('Cybersource\Client\Client');
$conf = $c->getConfig();
var_dump($conf);
return new ViewModel();
}
}
上面的控制器输出将转储配置的输出,因为我向 Client 类添加了一个名为 getConfig() 的函数以用于显示/测试目的。
再次感谢所有帮助。