我正在使用Zf2,以某种方式克隆了zf3,application.config.php仍然是zf2,它已配置了我的模块,但是由于无法从ServiceManager中找到路由而抛出了异常。
如何将模块配置添加到我的应用程序? 两种应用程序的配置不同。
谢谢,
W。
答案 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
文件,并且仍然使用此类。