获取配置 Zend Framework 2

Get configuration Zend Framework 2

我有一个 Zend Framework 项目,我试图在 Zend Framework 2 上重写这个项目。在旧项目中,我在 application.ini[ 中有一些依赖于环境的设置=12=]

[Prod]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

resources.frontController.params.displayExceptions = 1

theme = Test

copyright = TestText
resources.db.adapter = pdo_mysql
resources.db.params.host = 127.0.0.1
resources.db.params.username = root
resources.db.params.password = adm3
resources.db.params.dbname = test;

我控制了一些来自 aplication.ini 的值。

   $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
    $aConfig = $bootstrap->getOptions();
    $this->view->assign('theme', $aConfig['theme']);
    $this->view->assign('copyright', $aConfig['copyright']);

我用 Zend Framework 2 下载 skeleton-application,添加新模块。但是我怎样才能在我的新项目中做类似的事情呢?我应该在哪里以及如何描述旧项目的设置?我怎样才能找回它?

您可以轻松地为您的 ZF2 模块使用 AbstractOptions class。假设您的 ZF2 模块称为应用程序。所以它存储在/module/Application/文件夹中。

首先你需要 /module/Application/src/Options/ 下的 ModuleOptions class。在此 class 中,您可以写下您的模块所需的所有设置。例如原因我只写版权成员在class。

declare('strict_types=1');
namespace Application\Options;
use Zend\StdLib\AbstractOptions;

class ModuleOptions extends AbstractOptions
{
    protected $copyright = 'my copyright';

    public function getCopyright() : string
    {
        return $this->copyright;
    }

    public function setCopyright(string $copyright) : ModuleOptions
    {
        $this->copyright = $copyright;
        return $this;
    }
}

此外,您还需要一个用于模块选项的工厂 class。该工厂可能类似于以下示例。

declare('strict_types=1');
namespace Application\options\Factory;

use Application\Options\ModuleOptions;
use Interop\Container\ContainerInterface;

class ModuleOptionsFactory
{
    public function __invoke(ContainerInterface $container) : ModuleOptions
    {
        $config = $container->get('config');
        $options = new ModuleOptions(isset($config['my_settings']) ? $config['my_settings'] : []);
        return $options;
    }
}

基本上这就是您所需要的。就像下面的例子一样,把它包裹在你的 module.config.php 中。

...
'service_manager' => [
    'factories' => [
        ModuleOptions::class => ModuleOptionsFactory::class,
    ]
],
'my_settings' = [
    'copyright' => 'another copyright text',
]

ModuleOptions class 从您的 module.config.php 中获取 my_settings 数组,并使其在任何有服务定位器的地方都可以访问。

在控制器中使用的示例

例如,您可以在控制器工厂中使用 ModuleOptions class,如下例所示。

class IndexControllerFactory
{
    public function __invoke(ContainerInterface $container)
    {
        $container = $container->getServiceLocator();
        $options = $container->get(ModuleOptions::class);

        return new IndexController($options);
    }
}

您的 IndexController class 看起来像这样。在此示例中,我们避免在控制器本身中调用服务定位器,因为这是一种不好的做法。我们只是将选项作为参数传递给构造函数。

class IndexController extends AbstractActionController
{
    protected $options;

    public function __construct(ModuleOptions $options)
    {
        $this->options = $options;
    }

    public function indexAction()
    {
        return [
            'copyright' => $this->options->getCopyright(),
        ];
    }

尽情享受吧! ;)