如何配置application.config.php

时间:2018-09-26 21:54:33

标签: php zend-framework2 zend-framework3

我正在使用Zf2,以某种方式克隆了zf3,application.config.php仍然是zf2,它已配置了我的模块,但是由于无法从ServiceManager中找到路由而抛出了异常。

如何将模块配置添加到我的应用程序? 两种应用程序的配置不同。

谢谢,
W。

2 个答案:

答案 0 :(得分:0)

application.config.php应该描述系统需要的所有模块。 例如:

return [
    'modules' => [
    'Application',
    'Module1',
    'Module2',
    ],
    'module_listener_options' => [
    'config_glob_paths' => [
        'config/autoload/{,*.}{global,local}.php'
    ],
    'config_cache_enabled' => false,
    'cache_dir' => 'data/cache',
    'module_paths' => [
        './module',
        './vendor'
    ]
    ],
    'service_manager' => [
    'use_defaults' => true,
    'factories' => []
    ]
];

ZF会读取每个模块Module.php文件,并使用方法getConfig()加载关联的配置文件

默认值为:

public function getConfig()
{
    return include __DIR__ . '/config/module.config.php';
}

例如,您可以:

public function getConfig()
{
    $user = include __DIR__ . '/config/user.config.php';
    $group = include __DIR__ . '/config/group.config.php';
    $account = include __DIR__ . '/config/module.config.php';
    return array_merge_recursive($user, $group, $account);
}

答案 1 :(得分:0)

我建议您下载SkeletonApplication,它是为学习目的而设置的。它清楚地说明和解释了配置中的不同默认值。默认application.config.php here

在此默认配置中,您将找到以下内容:

// Retrieve list of modules used in this application.
'modules' => require __DIR__ . '/modules.config.php',

因此,您在modules.config.php旁边有一个单独的application.config.php,以分隔这些问题。默认情况下,它看起来像这样:

<?php
/**
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */
/**
 * List of enabled modules for this application.
 *
 * This should be an array of module namespaces used in the application.
 */
return [
    'Zend\Router',
    'Zend\Validator',
    'Application',
];

尽管您在运行composer install之后会在此处添加更多内容。

在骨架的唯一模块(Application)中,您还会在src/文件夹中找到一个Module.php。这是从/从中加载模块配置的地方。

在这里,我建议您通过在某个地方的通用模块(MVC?)中创建自己的AbstractModule类,开始偏离默认设置。我建议这样做,以尽量减少重复代码的数量,因为大多数模块都不会像上面的默认链接那样具有简单的“这是配置,您可以做得到”。

我自己的Module.php类如下:

class Module extends AbstractModule
{
    public function __construct()
    {
        parent::__construct(__DIR__, __NAMESPACE__);
    }
}

AbstractModule是这样:

abstract class AbstractModule implements ConfigProviderInterface, AutoloaderProviderInterface
{
    /**
     * @var String Path of current module
     */
    protected $path;

    /**
     * @var String Namespace of current module
     */
    protected $namespace;

    /**
     * This is to be called by descendant classes with:
     * parent::__construct(__DIR__, __NAMESPACE__)
     *
     * @param $path      string Module path
     * @param $namespace string Module namespace
     */
    public function __construct($path, $namespace)
    {
        $this->path = $path;
        $this->namespace = $namespace;
    }

    /**
     * @return array
     */
    public function getConfig()
    {
        $config = [];

        $path = $this->path 
            . DIRECTORY_SEPARATOR . '..' 
            . DIRECTORY_SEPARATOR . 'config' 
            . DIRECTORY_SEPARATOR . '*.php';

        foreach (glob($path) as $filename) {
            $config = array_merge_recursive($config, include $filename);
        }

        return $config;
    }

    /**
     * @return array
     */
    public function getAutoloaderConfig()
    {
        return [
            'Zend\Loader\StandardAutoloader' => [
                'namespaces' => [
                    $this->namespace => $this->path . DIRECTORY_SEPARATOR . 'src',
                ],
            ],
        ];
    }
}

此设置仍将允许您修改特定模块的Module.php,并且它的通用性在于,如果您不需要执行其他任何操作,则只需要__construct可以对子类起作用。

请注意,此设置将使用.php文件夹中的所有config/文件。因此,您可以开发自己的软件包以包括默认配置.dist文件,并且仍然使用此类。