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

时间:2017-09-14 08:05:25

标签: php zend-framework zend-framework2

我有一个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不太熟悉,所以我不知道从哪里开始。我已经看过许多关于如何通过控制器,视图等进行此操作的教程,但不是在特定的类中。

谢谢。

1 个答案:

答案 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测试