typo3-ddev
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTYPO3 DDEV Local Development
TYPO3 基于DDEV的本地开发
Compatibility: TYPO3 v13.x and v14.x (v14 preferred) All configurations in this skill support both TYPO3 v13 and v14.
TYPO3 API First: Always use TYPO3's built-in APIs, core features, and established conventions before creating custom implementations. Do not reinvent what TYPO3 already provides. Always verify that the APIs and methods you use exist and are not deprecated in your target TYPO3 version (v13 or v14) by checking the official TYPO3 documentation.
兼容性: TYPO3 v13.x 和 v14.x(推荐使用v14) 本技能中的所有配置均支持TYPO3 v13和v14版本。
TYPO3 API优先原则: 在创建自定义实现之前,始终优先使用TYPO3的内置API、核心功能和既定规范。不要重复造轮子。在使用API和方法前,务必通过官方TYPO3文档确认它们在目标版本(v13或v14)中存在且未被弃用。
Container Priority
容器使用优先级
Always check for existing containers first:
- Check exists → use
.ddev/ddev exec - Check exists → use
docker-compose.ymldocker compose exec - Only use system tools if no container environment
Critical: Use the project's configured PHP version, not system PHP.
始终优先检查现有容器:
- 检查是否存在目录 → 使用
.ddev/ddev exec - 检查是否存在文件 → 使用
docker-compose.ymldocker compose exec - 仅在没有容器环境时使用系统工具
重要提示: 使用项目配置的PHP版本,而非系统PHP。
1. Project Initialization
1. 项目初始化
New TYPO3 Project (v14 - Preferred)
新建TYPO3项目(v14 - 推荐)
bash
undefinedbash
undefinedCreate project directory
创建项目目录
mkdir my-typo3-project && cd my-typo3-project
mkdir my-typo3-project && cd my-typo3-project
Initialize DDEV with TYPO3 preset
使用TYPO3预设初始化DDEV
ddev config --project-type=typo3 --docroot=public --php-version=8.3
ddev config --project-type=typo3 --docroot=public --php-version=8.3
Start the environment
启动开发环境
ddev start
ddev start
Install TYPO3 v14 (preferred)
安装TYPO3 v14(推荐版本)
ddev composer create "typo3/cms-base-distribution:^14"
ddev composer create "typo3/cms-base-distribution:^14"
Run TYPO3 setup
运行TYPO3安装向导
ddev typo3 setup
undefinedddev typo3 setup
undefinedNew TYPO3 Project (v13 LTS)
新建TYPO3项目(v13 LTS)
bash
undefinedbash
undefinedCreate project directory
创建项目目录
mkdir my-typo3-project && cd my-typo3-project
mkdir my-typo3-project && cd my-typo3-project
Initialize DDEV with TYPO3 preset
使用TYPO3预设初始化DDEV
ddev config --project-type=typo3 --docroot=public --php-version=8.2
ddev config --project-type=typo3 --docroot=public --php-version=8.2
Start the environment
启动开发环境
ddev start
ddev start
Install TYPO3 v13 LTS
安装TYPO3 v13 LTS版本
ddev composer create "typo3/cms-base-distribution:^13"
ddev composer create "typo3/cms-base-distribution:^13"
Run TYPO3 setup
运行TYPO3安装向导
ddev typo3 setup
undefinedddev typo3 setup
undefinedExisting TYPO3 Project
现有TYPO3项目
bash
undefinedbash
undefinedClone repository
克隆代码仓库
git clone git@github.com:org/project.git
cd project
git clone git@github.com:org/project.git
cd project
Configure DDEV (if not already)
配置DDEV(如果尚未配置)
ddev config --project-type=typo3 --docroot=public --php-version=8.3
ddev config --project-type=typo3 --docroot=public --php-version=8.3
Start and install dependencies
启动环境并安装依赖
ddev start
ddev composer install
ddev start
ddev composer install
Import database (see Database Operations)
导入数据库(详见数据库操作章节)
undefinedundefined2. Recommended Configuration
2. 推荐配置
.ddev/config.yaml
(v13/v14 Compatible)
.ddev/config.yaml.ddev/config.yaml
(兼容v13/v14)
.ddev/config.yamlyaml
name: my-typo3-project
type: typo3
docroot: public
php_version: "8.3" # 8.2 minimum for v13, 8.3 recommended for v14
webserver_type: nginx-fpm
database:
type: mariadb
version: "10.11" # 10.11+ or 11.x recommended for both v13/v14yaml
name: my-typo3-project
type: typo3
docroot: public
php_version: "8.3" # v13最低要求PHP 8.2,v14推荐使用PHP 8.3
webserver_type: nginx-fpm
database:
type: mariadb
version: "10.11" # v13/v14均推荐使用10.11+或11.x版本Fixed port for external tools (MySQL MCP, etc.)
为外部工具(如MySQL MCP等)设置固定端口
host_db_port: "33060"
host_webserver_port: "8080"
host_https_port: "8443"
host_db_port: "33060"
host_webserver_port: "8080"
host_https_port: "8443"
Enable Mailpit for email testing (replaced Mailhog in newer DDEV)
启用Mailpit进行邮件测试(在新版DDEV中替代了Mailhog)
mailpit_http_port: "8025"
mailpit_http_port: "8025"
PHP settings
PHP设置
web_environment:
- TYPO3_CONTEXT=Development
- PHP_IDE_CONFIG=serverName=my-typo3-project.ddev.site
web_environment:
- TYPO3_CONTEXT=Development
- PHP_IDE_CONFIG=serverName=my-typo3-project.ddev.site
Additional services
额外服务
hooks:
post-start:
- exec: composer install --no-interaction
undefinedhooks:
post-start:
- exec: composer install --no-interaction
undefined.ddev/config.local.yaml
(Personal Overrides)
.ddev/config.local.yaml.ddev/config.local.yaml
(个人自定义配置)
.ddev/config.local.yamlyaml
undefinedyaml
undefinedPersonal machine-specific overrides (gitignored)
针对个人机器的自定义配置(需加入.gitignore)
host_db_port: "33061" # If 33060 conflicts
undefinedhost_db_port: "33061" # 如果33060端口被占用则修改
undefinedPHP Version Matrix
PHP版本对应表
| TYPO3 Version | Minimum PHP | Recommended PHP | MariaDB |
|---|---|---|---|
| v13.4 LTS | 8.2 | 8.3 | 10.11+ |
| v14.x | 8.2 | 8.3 / 8.4 | 10.11+ |
| TYPO3版本 | 最低PHP版本 | 推荐PHP版本 | MariaDB版本 |
|---|---|---|---|
| v13.4 LTS | 8.2 | 8.3 | 10.11+ |
| v14.x | 8.2 | 8.3 / 8.4 | 10.11+ |
3. Database Operations
3. 数据库操作
Import Database
导入数据库
bash
undefinedbash
undefinedFrom SQL file
从SQL文件导入
ddev import-db --file=dump.sql
ddev import-db --file=dump.sql
From gzipped file
从压缩的SQL文件导入
ddev import-db --file=dump.sql.gz
ddev import-db --file=dump.sql.gz
From remote (via SSH)
从远程服务器导入(通过SSH)
ssh user@server "mysqldump -u root dbname | gzip" | gunzip | ddev import-db
undefinedssh user@server "mysqldump -u root dbname | gzip" | gunzip | ddev import-db
undefinedExport Database
导出数据库
bash
undefinedbash
undefinedStandard export
标准导出(压缩格式)
ddev export-db --file=backup.sql.gz
ddev export-db --file=backup.sql.gz
Without gzip
不压缩导出
ddev export-db --gzip=false --file=backup.sql
undefinedddev export-db --gzip=false --file=backup.sql
undefinedDatabase Snapshots
数据库快照
bash
undefinedbash
undefinedCreate snapshot before risky operation
在执行高风险操作前创建快照
ddev snapshot --name=before-upgrade
ddev snapshot --name=before-upgrade
List snapshots
列出所有快照
ddev snapshot --list
ddev snapshot --list
Restore snapshot
恢复快照
ddev snapshot restore before-upgrade
ddev snapshot restore before-upgrade
Delete snapshot
删除快照
ddev snapshot delete before-upgrade
undefinedddev snapshot delete before-upgrade
undefinedDirect MySQL Access
直接访问MySQL
bash
undefinedbash
undefinedMySQL CLI
进入MySQL命令行
ddev mysql
ddev mysql
Execute query
执行查询语句
ddev mysql -e "SELECT uid, title FROM pages WHERE hidden = 0"
ddev mysql -e "SELECT uid, title FROM pages WHERE hidden = 0"
Connect from external tool (e.g., TablePlus, DBeaver)
通过外部工具连接(如TablePlus、DBeaver)
Host: 127.0.0.1
主机:127.0.0.1
Port: 33060 (or your configured host_db_port)
端口:33060(或你配置的host_db_port)
User: db
用户名:db
Password: db
密码:db
Database: db
数据库名:db
undefinedundefined4. TYPO3 CLI Commands
4. TYPO3 CLI命令
Console Commands
控制台命令
bash
undefinedbash
undefinedList all commands
列出所有可用命令
ddev typo3 list
ddev typo3 list
Clear all caches
清空所有缓存
ddev typo3 cache:flush
ddev typo3 cache:flush
Clear specific cache
清空指定类型的缓存
ddev typo3 cache:flush --group=pages
ddev typo3 cache:flush --group=pages
Update database schema
更新数据库表结构
ddev typo3 database:updateschema
ddev typo3 database:updateschema
Reference index
更新引用索引
ddev typo3 referenceindex:update
ddev typo3 referenceindex:update
Scheduled tasks
执行定时任务
ddev typo3 scheduler:run
ddev typo3 scheduler:run
Run upgrade wizards (after version update)
运行升级向导(版本更新后)
ddev typo3 upgrade:list
ddev typo3 upgrade:run
undefinedddev typo3 upgrade:list
ddev typo3 upgrade:run
undefinedExtension Management
扩展管理
bash
undefinedbash
undefinedInstall extension from TER
从TER安装扩展
ddev composer require typo3/cms-seo
ddev composer require typo3/cms-seo
Install extension from Packagist
从Packagist安装扩展
ddev composer require vendor/extension-name
ddev composer require vendor/extension-name
Setup extensions (generate PackageStates.php)
初始化扩展(生成PackageStates.php)
ddev typo3 extension:setup
ddev typo3 extension:setup
Activate extension
启用扩展
ddev typo3 extension:activate my_extension
ddev typo3 extension:activate my_extension
Deactivate extension
禁用扩展
ddev typo3 extension:deactivate my_extension
undefinedddev typo3 extension:deactivate my_extension
undefined5. Composer Operations
5. Composer操作
bash
undefinedbash
undefinedInstall dependencies
安装依赖
ddev composer install
ddev composer install
Update all dependencies
更新所有依赖
ddev composer update
ddev composer update
Update single package
更新单个包
ddev composer update typo3/cms-core --with-dependencies
ddev composer update typo3/cms-core --with-dependencies
Require new package (with v13/v14 dual compatibility)
安装新包(同时兼容v13/v14)
ddev composer require "vendor/package:^1.0"
ddev composer require "vendor/package:^1.0"
Remove package
移除包
ddev composer remove vendor/package
ddev composer remove vendor/package
Clear Composer cache
清空Composer缓存
ddev composer clear-cache
undefinedddev composer clear-cache
undefinedDual-Version Development
多版本兼容开发
For extensions supporting both v13 and v14:
bash
undefined针对同时支持v13和v14的扩展开发:
bash
undefinedSet version constraint in extension's composer.json
在扩展的composer.json中设置版本约束
ddev composer require "typo3/cms-core:^13.0 || ^14.0" --no-update
undefinedddev composer require "typo3/cms-core:^13.0 || ^14.0" --no-update
undefined6. File Operations
6. 文件操作
SSH into Container
进入容器SSH
bash
undefinedbash
undefinedWeb container (as www-data)
以www-data用户进入Web容器
ddev ssh
ddev ssh
Web container (as root)
以root用户进入Web容器
ddev ssh -s web -u root
ddev ssh -s web -u root
Database container
进入数据库容器
ddev ssh -s db
undefinedddev ssh -s db
undefinedFile Sync
文件同步
bash
undefinedbash
undefinedCopy file into container
在容器内复制文件
ddev exec cp /path/in/container /other/path
ddev exec cp /path/in/container /other/path
Copy from host to container
从主机复制文件到容器
docker cp localfile.txt ddev-myproject-web:/var/www/html/
docker cp localfile.txt ddev-myproject-web:/var/www/html/
Download file from container
从容器下载文件到主机
ddev exec cat /var/www/html/somefile > localfile
undefinedddev exec cat /var/www/html/somefile > localfile
undefined7. Debugging with Xdebug
7. 使用Xdebug调试
Enable/Disable
启用/禁用
bash
undefinedbash
undefinedEnable Xdebug
启用Xdebug
ddev xdebug on
ddev xdebug on
Disable Xdebug (faster performance)
禁用Xdebug(提升性能)
ddev xdebug off
ddev xdebug off
Check status
查看Xdebug状态
ddev xdebug status
undefinedddev xdebug status
undefinedIDE Configuration (PhpStorm/Cursor)
IDE配置(PhpStorm/Cursor)
- Set breakpoint in PHP file
- Start listening for connections (PhpStorm: "Start Listening")
- Enable Xdebug:
ddev xdebug on - Trigger request in browser
- Debugger should connect
- 在PHP文件中设置断点
- 启动IDE的监听连接功能(PhpStorm:"Start Listening")
- 启用Xdebug:
ddev xdebug on - 在浏览器中触发请求
- 调试器应自动连接
Xdebug Environment
Xdebug环境配置
yaml
undefinedyaml
undefined.ddev/config.yaml
.ddev/config.yaml
web_environment:
- XDEBUG_MODE=debug,develop
- XDEBUG_CONFIG=client_host=host.docker.internal
undefinedweb_environment:
- XDEBUG_MODE=debug,develop
- XDEBUG_CONFIG=client_host=host.docker.internal
undefined8. Multi-Site Configuration
8. 多站点配置
Additional Hostnames
额外主机名
yaml
undefinedyaml
undefined.ddev/config.yaml
.ddev/config.yaml
additional_hostnames:
- site1
- site2 additional_fqdns:
- site1.myproject.ddev.site
- site2.myproject.ddev.site
undefinedadditional_hostnames:
- site1
- site2 additional_fqdns:
- site1.myproject.ddev.site
- site2.myproject.ddev.site
undefinedSite Configuration
站点配置
bash
undefinedbash
undefinedCreate site configuration
创建站点配置目录
mkdir -p config/sites/site1
```yamlmkdir -p config/sites/site1
```yamlconfig/sites/site1/config.yaml
config/sites/site1/config.yaml
base: 'https://site1.myproject.ddev.site/'
rootPageId: 1
languages:
- title: English languageId: 0 locale: en_US.UTF-8
undefinedbase: 'https://site1.myproject.ddev.site/'
rootPageId: 1
languages:
- title: English languageId: 0 locale: en_US.UTF-8
undefined9. Services and Add-ons
9. 服务与附加组件
Common Add-ons
常用附加组件
bash
undefinedbash
undefinedRedis (for caching)
Redis(用于缓存)
ddev get ddev/ddev-redis
ddev get ddev/ddev-redis
Elasticsearch
Elasticsearch
ddev get ddev/ddev-elasticsearch
ddev get ddev/ddev-elasticsearch
Solr
Solr
ddev get ddev/ddev-solr
undefinedddev get ddev/ddev-solr
undefinedCustom Services
自定义服务
yaml
undefinedyaml
undefined.ddev/docker-compose.redis.yaml
.ddev/docker-compose.redis.yaml
services:
redis:
image: redis:7-alpine
container_name: ddev-${DDEV_SITENAME}-redis
command: redis-server --appendonly yes
volumes:
- redis-data:/data
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
volumes:
redis-data:
undefinedservices:
redis:
image: redis:7-alpine
container_name: ddev-${DDEV_SITENAME}-redis
command: redis-server --appendonly yes
volumes:
- redis-data:/data
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
volumes:
redis-data:
undefinedRedis Caching Configuration (v13/v14)
Redis缓存配置(v13/v14)
php
<?php
// config/system/additional.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['hash']['backend']
= \TYPO3\CMS\Core\Cache\Backend\RedisBackend::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['hash']['options'] = [
'hostname' => 'redis',
'port' => 6379,
'database' => 0,
];php
<?php
// config/system/additional.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['hash']['backend']
= \TYPO3\CMS\Core\Cache\Backend\RedisBackend::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['hash']['options'] = [
'hostname' => 'redis',
'port' => 6379,
'database' => 0,
];10. Troubleshooting
10. 故障排查
Common Issues
常见问题解决
bash
undefinedbash
undefinedRestart everything
重启所有服务
ddev restart
ddev restart
Full reset (keeps database)
完全重置(保留数据库)
ddev stop && ddev start
ddev stop && ddev start
Nuclear option (removes containers and database volume)
彻底清理(删除容器及数据库卷)
ddev delete -O && ddev start
ddev delete -O && ddev start
View logs
查看日志
ddev logs
ddev logs
View specific service logs
查看指定服务的日志
ddev logs -s web
ddev logs -s db
undefinedddev logs -s web
ddev logs -s db
undefinedPort Conflicts
端口冲突
bash
undefinedbash
undefinedCheck what's using a port
检查端口占用情况
lsof -i :80
lsof -i :80
Use different ports in config.yaml
在config.yaml中使用其他端口
router_http_port: "8080"
router_https_port: "8443"
undefinedrouter_http_port: "8080"
router_https_port: "8443"
undefinedPermission Issues
权限问题
bash
undefinedbash
undefinedFix file permissions
修复文件权限
ddev exec chmod -R g+w var/
ddev exec chmod -R g+w public/fileadmin/
ddev exec chmod -R g+w public/typo3temp/
undefinedddev exec chmod -R g+w var/
ddev exec chmod -R g+w public/fileadmin/
ddev exec chmod -R g+w public/typo3temp/
undefined11. Environment Variables
11. 环境变量
TYPO3 Context
TYPO3运行上下文
bash
undefinedbash
undefinedDevelopment (default in DDEV)
开发环境(DDEV默认)
TYPO3_CONTEXT=Development
TYPO3_CONTEXT=Development
Production testing
生产测试环境
TYPO3_CONTEXT=Production
TYPO3_CONTEXT=Production
Sub-contexts
子上下文
TYPO3_CONTEXT=Development/Docker
undefinedTYPO3_CONTEXT=Development/Docker
undefinedCustom Variables
自定义变量
yaml
undefinedyaml
undefined.ddev/config.yaml
.ddev/config.yaml
web_environment:
- MY_API_KEY=secret123
- FEATURE_FLAG=enabled
Access in TYPO3:
```php
<?php
$apiKey = getenv('MY_API_KEY');
// or
$apiKey = $_ENV['MY_API_KEY'];web_environment:
- MY_API_KEY=secret123
- FEATURE_FLAG=enabled
在TYPO3中访问:
```php
<?php
$apiKey = getenv('MY_API_KEY');
// 或者
$apiKey = $_ENV['MY_API_KEY'];12. Best Practices
12. 最佳实践
Performance
性能优化
- Disable Xdebug when not debugging ()
ddev xdebug off - Use snapshots instead of full imports for quick state changes
- Mount with Mutagen on macOS for better file sync performance
- Use PHP 8.3 for best performance on v13/v14
- 调试完成后禁用Xdebug()
ddev xdebug off - 使用快照替代完整数据库导入,快速切换开发状态
- 在macOS上使用Mutagen挂载以提升文件同步性能
- 使用PHP 8.3以获得v13/v14版本的最佳性能
Team Workflow
团队协作工作流
- Commit to repository
.ddev/config.yaml - Gitignore for personal overrides
.ddev/config.local.yaml - Document additional setup steps in
README.md - Share database snapshots for consistent development data
- 提交 到代码仓库
.ddev/config.yaml - 将 加入.gitignore,用于个人自定义配置
.ddev/config.local.yaml - 在README.md中记录额外的安装步骤
- 共享数据库快照以保证开发数据一致性
Security
安全注意事项
- Never expose DDEV ports publicly
- Don't use DDEV in production
- Rotate any sensitive data in development databases
- 不要公开暴露 DDEV端口
- 不要在生产环境中使用 DDEV
- 定期轮换开发数据库中的敏感数据
13. Multi-Version Testing (Extension Development)
13. 多版本测试(扩展开发)
When developing extensions that need to work across multiple TYPO3 versions:
当开发需要兼容多个TYPO3版本的扩展时:
Setup for Multi-Version Testing
多版本测试环境搭建
yaml
undefinedyaml
undefined.ddev/config.yaml
.ddev/config.yaml
name: my-extension
type: php
docroot: ""
php_version: "8.3"
additional_hostnames:
- v13
- v14
undefinedname: my-extension
type: php
docroot: ""
php_version: "8.3"
additional_hostnames:
- v13
- v14
undefinedInstall Multiple TYPO3 Versions
安装多个TYPO3版本
bash
undefinedbash
undefinedCreate version-specific directories
创建版本专属目录
mkdir -p v13 v14
mkdir -p v13 v14
Install TYPO3 v13
安装TYPO3 v13
cd v13
ddev composer create "typo3/cms-base-distribution:^13"
cd ..
cd v13
ddev composer create "typo3/cms-base-distribution:^13"
cd ..
Install TYPO3 v14
安装TYPO3 v14
cd v14
ddev composer create "typo3/cms-base-distribution:^14"
cd ..
cd v14
ddev composer create "typo3/cms-base-distribution:^14"
cd ..
Symlink extension
软链接扩展到各个版本目录
ln -s ../../../ v13/packages/my_extension
ln -s ../../../ v14/packages/my_extension
undefinedln -s ../../../ v13/packages/my_extension
ln -s ../../../ v14/packages/my_extension
undefinedAccess URLs
访问地址
| Environment | URL |
|---|---|
| TYPO3 v13 | |
| TYPO3 v14 | |
Default Credentials: admin / Joh316!
| 环境 | 地址 |
|---|---|
| TYPO3 v13 | |
| TYPO3 v14 | |
默认凭据:admin / Joh316!
Version-Specific Commands
版本专属命令
bash
undefinedbash
undefinedRun tests on v13
在v13环境运行测试
ddev exec -d /var/www/html/v13 vendor/bin/phpunit
ddev exec -d /var/www/html/v13 vendor/bin/phpunit
Run tests on v14
在v14环境运行测试
ddev exec -d /var/www/html/v14 vendor/bin/phpunit
ddev exec -d /var/www/html/v14 vendor/bin/phpunit
Clear cache for specific version
清空指定版本的缓存
ddev exec -d /var/www/html/v13 vendor/bin/typo3 cache:flush
---ddev exec -d /var/www/html/v13 vendor/bin/typo3 cache:flush
---Credits & Attribution
致谢与贡献
Thanks to Netresearch DTT GmbH for their contributions to the TYPO3 community.
感谢Netresearch DTT GmbH为TYPO3社区所做的贡献。