迁移到 Laminas FAQ

FAQ

模块和配置处理器的注入

如果你正在将一个 MVC, Apigility, 或者 Expressive 应用迁移到 Laminas, 迁移工具将会尝试在你的应用中注入一些代码。如果你使用的是为标准配置的话, 这样做就有可能导致迁移失败。

迁移 MVC 及 Apigility 应用

在迁移 MVC 及 Apigility 应用至 Laminas MVC 和 Laminas API 工具时, 迁移工具将会尝试在 config/modules.config.php 文件中添加 Laminas\ZendFrameworkBridge 模块。如果添加失败, 你可以选择一个合适的方式将其引入。

Expressive

在迁移 Expressive 应用至 Mezzio 时,迁移工具将会尝试在 ConfigAggregator 的构造函数中添加一个后置处理器 Laminas\ZendFrameworkBridge\ConfigPostProcessorConfigAggregator 的构造函数如下所示:

public function __construct(
    array $providers = [],
    ?string $cachedConfigFile = null,
    array $postProcessors = []
)

通常 Expressive 及 Mezzio 用用的 config/config.php 文件结构如下:

$cacheConfig = [
    'config_cache_path' => 'data/cache/app_config.php',
];

$aggregator = new ConfigAggregator([
    // config providers from 3rd party code
    // ...

    // App-specific modules
    // ...

    // Include cache configuration
    new ArrayProvider($cacheConfig),

    // Load application config in a pre-defined order in such a way that local settings
    // overwrite global settings. (Loaded as first to last):
    //   - `global.php`
    //   - `*.global.php`
    //   - `local.php`
    //   - `*.local.php`
    new PhpFileProvider('config/autoload/{{,*.}global,{,*.}local}.php'),

    // Load development config if it exists
    new PhpFileProvider('config/development.config.php'),
], $cacheConfig['config_cache_path']);

return $aggregator->getMergedConfig();

迁移工具会将最后两行改为:

], $cacheConfig['config_cache_path'], [\Laminas\ZendFrameworkBridge\ConfigPostProcessor::class]);

大多数情况的注入失败的原因就是因为参数的结构得到了破坏。这种情况下就是自己手动添加上面的参数。

另外,应用可能正在使用其他的后置处理器。如果是这样额话,就要直接添加 \Laminas\ZendFrameworkBridge\ConfigPostProcessor::class

清理缓存

如果你的应用无法在开发环境中运行,你可能需要清理之前遗留的缓存。 如果你使用 zf-development-mode (将会变更为 laminas-development-mode!),尝试去开启开发模式:

$ composer development-enable

Expressive/Mezzio 可以使用 clear-config-cache 命令:

$ composer clear-config-cache

Zend Framework v1 注意事项

Zend Framework version 1 以及停止维护, 因此在迁移过程中不会进行任何重写操作。然而,项目中的自定义代码可能会受到重写。这将会导致一些错误。

Zend_Mail

Zend_Mail 组件使用 "ZendMail_" 文件名前缀,如 Zend_Mail_Transport_File。 迁移后 transport 适配器将会继续使用 "ZendMail_" 作为文件前缀。 但是在自定义模块中的 "ZendMail_" 前缀则会被重写为 "LaminasMail_"。

由于 V1 Zend_Mail 组件及其最新的版本均使用 "ZendMail_" 前缀,迁移工具在重写自定义代码的时候将无法识别。 所以你需要排查所有使用此前缀的代码。