获取配置Zend Framework 2

时间:2018-01-10 13:34:37

标签: php zend-framework zend-framework2

我有一个Zend Framework项目,我试图在Zend Framework 2上重写这个项目。在旧项目中,我在 application.ini

中有一些依赖于环境的设置
[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 = adm$123
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 ,添加新模块。但是我在新项目中如何做到类似呢?我应该在哪里以及如何描述旧项目的设置?我怎么能找回来的?

1 个答案:

答案 0 :(得分:2)

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

首先,您需要/ module / Application / src / Options /下的ModuleOptions类。在本课程中,您可以记下模块所需的所有设置。例如,我只在课堂上写了版权成员。

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;
    }
}

此外,您需要一个工厂用于您的模块选项类。这个工厂看起来像下面的例子。

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类从module.config.php获取my_settings数组,并使其在服务定位器所在的任何位置都可访问。

在控制器中使用的示例

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

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

        return new IndexController($options);
    }
}

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

class IndexController extends AbstractActionController
{
    protected $options;

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

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

享受! ;)