繁体   English   中英

使用zend全局配置的许多模块中使用的ZF2模型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM