[英]ZF2 Model used in many modules using zend global config
我在zend结构的许多模块中都有一个Class对象:
/module/
--|Aplication
--|MyClassModule
----|config
----|src
------|Factory
------|Model
---------|> MyObjectClass.php
----Module.php
--|AnotherModule
因此,我的想法是在其他模块中使用此MyObjectClass.php,以便避免重复并拥有自己的配置。 到目前为止,这是可以的,但是我想从此类中注入的config / autoload文件中获取变量集,但我不知道如何。
如何将该配置数据加载到类模型中? 哪种方法最好? 我可以通过直接访问它来加载它,但我认为这不是很优雅
例如: $configArray = require './config/autoload/config.local.php';
我对zend不太了解,所以我不知道从哪里开始。 我已经看过许多关于如何通过控制器,视图等等实现此目的的教程,但是在特定的类中却没有。
谢谢。
引导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中的service_manager
config的factories
部分中注册自己的服务/工厂:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.