我有一个Class对象,在我的zend结构中的许多模块中使用:
/module/
--|Aplication
--|MyClassModule
----|config
----|src
------|Factory
------|Model
---------|> MyObjectClass.php
----Module.php
--|AnotherModule
所以我的想法是在其他模块中使用这个MyObjectClass.php,这样我就可以避免重复并拥有自己的配置。到目前为止,这是可以的,但我想从我的 config / autoload 文件中注入变量集,但我不知道如何。
如何将此配置数据加载到我的班级模型中?哪种方法最好?我可以直接访问它来加载它,但我不认为这是非常优雅的
例如:$configArray = require './config/autoload/config.local.php';
我对zend不太熟悉,所以我不知道从哪里开始。我已经看过许多关于如何通过控制器,视图等进行此操作的教程,但不是在特定的类中。
谢谢。
答案 0 :(得分:2)
当您的ZF2应用程序被引导时,所有配置文件都合并到一个配置中。这包括来自config/autoload
的local.php,global.php以及所有使用过的模块的module.config.php。通过一些更多的研究,您可以覆盖标准加载,例如加载自定义配置。
引导后,您可以从ServiceManager
访问配置。某些特定于ZF2的配置,service_manager等保留了密钥。
$serviceManager->get('config');
ZF2中有一个“标准”服务模式:Factory
。这可以应用于控制器,服务。什么你想要的。
namespace Application\Factory;
use Application\Model\MyObjectClass;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class MyObjectFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return mixed
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
// get some config parameter, inject it into model
$config = $serviceLocator->get('config');
$myObjectClass = new MyObjectClass();
// ... e.g. $myObjectClass->setConfig($config);
return $myObjectClass;
}
}
应该很清楚,这个工厂的用途是:创建并返回自定义对象的实例;)您可以使用一些配置参数配置您的实例。使用ServiceLocator
作为方法参数,您可以访问配置,其他服务等。
此外,您必须在模块的module.config.php的factories
配置的service_manager
部分注册您自己的服务/工厂:
return array(
'service_manager' => array(
'factories' => array(
'MyObjectFactory' => 'Application\Factory\MyObjectFactory',
),
),
);
现在您应该可以访问您的工厂,例如在ActionController
或您可以访问ServiceManager
的任何地方。这意味着,您也可以从不同的模块访问该工厂。
public function someCustomAction() {
$myObjectClass = $this->getServiceLocator()->get('MyObjectFactory');
$myObjectClass2 = $this->getServiceLocator()->get('MyObjectFactory');
var_dump($myObjectClass);
var_dump($myObjectClass2);
if ($myObjectClass === $myObjectClass2) {
echo '<br />equal';
}
$myObjectClass = new MyObjectClass();
$myObjectClass2 = new MyObjectClass();
var_dump($myObjectClass);
var_dump($myObjectClass2);
}
注意:强>
请注意,ServiceManager
返回对象的同一实例。那么,这看起来像你要求的?相反,创建新实例将创建不同的对象。
注2: 用ZF2 v2.4.9测试