You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移后Doctrine Cache报错:参数类型不匹配问题排查

问题分析与解决:Doctrine 5.x + Laminas Cache 3.x 迁移后的类型错误

问题背景

我开发了一个采用Doctrine进行数据库管理、Laminas构建REST API的PHP应用,正在进行版本迁移:将Doctrine从3.x升级至5.x,Laminas Cache从2.x升级至3.x。原应用运行完全正常,但迁移后启动时出现如下错误:

"TypeError: DoctrineModule\Cache\LaminasStorageCache::__construct(): Argument #1 ($storage) must be of type Laminas\Cache\Storage\StorageInterface, string given"

当前配置文件

Doctrine配置文件

<?php

use Doctrine\DBAL\Types\Types;
use Ramsey\Uuid\Doctrine\UuidBinaryType;
use Ramsey\Uuid\Doctrine\UuidType;

return [
    'doctrine' => [
        'connection' => [
            'orm_default' => [
                'driverClass' => Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                'params' => [
                    'url' => getenv('MYSQL_URL'),
                    'serverVersion' => getenv('MYSQL_VERSION'),
                ],
                'doctrine_type_mappings' => [
                    'bit' => Types::BOOLEAN,
                    UuidType::NAME => UuidType::NAME,
                    UuidBinaryType::NAME => Types::BINARY,
                ],
            ],
        ],
        'configuration' => [
            'orm_default' => [
                'generate_proxies' =>
                    false !== getenv('DOCTRINE_AUTOGENERATE_PROXY_CLASSES')
                        ? filter_var(getenv('DOCTRINE_AUTOGENERATE_PROXY_CLASSES'), FILTER_VALIDATE_BOOLEAN)
                        : true,
                'query_cache' => false !== getenv('DOCTRINE_CACHE_QUERY')
                    ? getenv('DOCTRINE_CACHE_QUERY')
                    : 'zendblackhole',
                'result_cache' => false !== getenv('DOCTRINE_CACHE_RESULT')
                    ? getenv('DOCTRINE_CACHE_RESULT')
                    : 'zendblackhole',
                'metadata_cache' => false !== getenv('DOCTRINE_CACHE_METADATA')
                    ? getenv('DOCTRINE_CACHE_METADATA')
                    : 'zendblackhole',
                'hydration_cache' => false !== getenv('DOCTRINE_CACHE_HYDRATION')
                    ? getenv('DOCTRINE_CACHE_HYDRATION')
                    : 'zendblackhole',
                'types' => [
                    UuidType::NAME => UuidType::class,
                    // 以下是无效的错误行
                    // UuidTypeDec::In对给定NE产显著Pre?ULTIR2,
                    UuidBinaryType::NAME => UuidBinaryType::class,
                ],
            ],
        ],
        'cache' => [
            'zendblackhole' => [
                'class' => \DoctrineModule\Cache\LaminasStorageCache::class,
                'instance' => 'zend-blackhole',
            ],
            'zendmemcache' => [
                'class' => \DoctrineModule\Cache\LaminasStorageCache::class,
                'instance' => 'zend-memcache',
            ],
        ],
    ],
];

Laminas Cache配置文件

<?php

return [
    'api-tools-cache' => [
        'zend-blackhole' => [
            'adapter' => \Laminas\Cache\Storage\Adapter\BlackHole::class,
        ],
        'zend-memcache' => [
            'adapter' => \Laminas\Cache\Storage\Adapter\Memcached::class,
            'options' => [
                'servers' => [
                    explode(':', getenv('MEMCACHE_SERVER')),
                ],
                'namespace' => 'my-app',
            ],
            'plugins' => [
                [
                    'name' => 'exception_handler',
                    'options' => [
                        'throw_exceptions' => true,
                    ],
                ],
            ],
        ],
    ],
];

错误原因与修复步骤

1. 核心错误:缓存配置的参数类型不匹配

DoctrineModule 5.x版本后,LaminasStorageCache的构造函数要求传入实现Laminas\Cache\Storage\StorageInterface的实例,不再接受字符串类型的缓存名称。原配置中'instance' => 'zend-blackhole'是字符串,不符合新的类型约束。

修复方法:修改Doctrine缓存配置结构

将Doctrine配置中cache节点下的instance键替换为storage,并使用Laminas Cache注册的服务ID(格式为Cache\Storage\{缓存名称}):

'cache' => [
    'zendblackhole' => [
        'class' => \DoctrineModule\Cache\LaminasStorageCache::class,
        'storage' => 'Cache\Storage\zend-blackhole', // 引用容器中的缓存服务实例
    ],
    'zendmemcache' => [
        'class' => \DoctrineModule\Cache\LaminasStorageCache::class,
        'storage' => 'Cache\Storage\zend-memcache',
    ],
],

2. 清理无效配置项

Doctrine配置的types节点中有一行无效的错误代码:UuidTypeDec::In对给定NE产显著Pre?ULTIR2,,直接删除该行,避免引发额外解析错误。

3. 确认Laminas Cache服务注册

api-tools-cache配置会自动在依赖注入容器中注册Cache\Storage\{缓存名称}格式的服务,你的现有Laminas Cache配置是正确的,但需确保环境变量MEMCACHE_SERVER存在且格式为host:port。

内容的提问来源于stack exchange,提问作者altralaser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:54:56