TYPO3 v13 + DDEV环境下数据库连接及数据操作问题求助
TYPO3 v13 + DDEV 数据库配置及增删改查实现指南
一、数据库连接配置
TYPO3 v13的配置逻辑与旧版本差异较大,结合DDEV默认环境按以下步骤操作:
- 确认DDEV数据库环境变量
DDEV会自动为项目注入数据库相关环境变量,检查项目根目录的.env.local文件,应包含:
TYPO3_DB_HOST=db TYPO3_DB_USER=db TYPO3_DB_PASSWORD=db TYPO3_DB_DATABASE=db TYPO3_DB_PORT=3306
若不存在,手动创建.env文件并写入上述内容。
- 配置TYPO3数据库连接
编辑config/system/settings.php,添加或修改数据库连接配置:
return [ 'DB' => [ 'Connections' => [ 'Default' => [ 'charset' => 'utf8mb4', 'dbname' => getenv('TYPO3_DB_DATABASE') ?: 'db', 'driver' => 'mysqli', 'host' => getenv('TYPO3_DB_HOST') ?: 'db', 'password' => getenv('TYPO3_DB_PASSWORD') ?: 'db', 'port' => (int)getenv('TYPO3_DB_PORT') ?: 3306, 'user' => getenv('TYPO3_DB_USER') ?: 'db', ], ], ], ];
- 解决install.php无配置选项问题
若已完成基础安装,install.php不会再显示数据库配置步骤。全新项目需先执行ddev exec composer install,再访问/install.php,安装流程会自动读取DDEV的数据库变量,无需手动输入。
二、数据库增删改查实现
TYPO3 v13推荐使用Doctrine DBAL或Extbase Repository实现数据库操作,以下两种方式任选:
方式1:快速实现(使用ConnectionPool)
直接调用核心API执行SQL操作,适合简单场景:
use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; // 获取默认数据库连接 $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionByName('Default'); $queryBuilder = $connection->createQueryBuilder(); // 查询单条数据 $record = $queryBuilder ->select('*') ->from('your_table') ->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT))) ->executeQuery() ->fetchAssociative(); // 插入数据 $connection->insert( 'your_table', ['title' => 'New Entry', 'crdate' => time()], [\PDO::PARAM_STR, \PDO::PARAM_INT] ); $newUid = $connection->lastInsertId(); // 更新数据 $connection->update( 'your_table', ['title' => 'Updated Entry'], ['uid' => $newUid], [\PDO::PARAM_STR, \PDO::PARAM_INT] ); // 删除数据 $connection->delete( 'your_table', ['uid' => $newUid], [\PDO::PARAM_INT] );
方式2:规范实现(使用Extbase Repository)
适合开发正式扩展,遵循TYPO3最佳实践:
创建扩展
执行ddev exec typo3 extension:create生成扩展(如my_extension),按提示填写信息。定义模型类
在Classes/Domain/Model/News.php中定义数据结构:
namespace Vendor\MyExtension\Domain\Model; use TYPO3\CMS\Extbase\DomainObject\AbstractEntity; class News extends AbstractEntity { protected string $title = ''; protected string $content = ''; public function getTitle(): string { return $this->title; } public function setTitle(string $title): void { $this->title = $title; } public function getContent(): string { return $this->content; } public function setContent(string $content): void { $this->content = $content; } }
- 创建Repository
在Classes/Domain/Repository/NewsRepository.php中定义数据操作方法:
namespace Vendor\MyExtension\Domain\Repository; use TYPO3\CMS\Extbase\Persistence\Repository; class NewsRepository extends Repository { public function findByTitle(string $title): array { $query = $this->createQuery(); $query->matching($query->equals('title', $title)); return $query->execute()->toArray(); } }
- 编写Controller
在Classes/Controller/NewsController.php中处理业务逻辑:
namespace Vendor\MyExtension\Controller; use Vendor\MyExtension\Domain\Repository\NewsRepository; use Vendor\MyExtension\Domain\Model\News; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class NewsController extends ActionController { public function __construct(protected NewsRepository $newsRepository) {} public function listAction(): void { $this->view->assign('newsItems', $this->newsRepository->findAll()); } public function createAction(News $news): void { $this->newsRepository->add($news); $this->redirect('list'); } public function updateAction(News $news): void { $this->newsRepository->update($news); $this->redirect('list'); } public function deleteAction(News $news): void { $this->newsRepository->remove($news); $this->redirect('list'); } }
- 配置TCA
在Configuration/TCA/Overrides/tx_myextension_domain_model_news.php中添加后台管理配置:
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_myextension_domain_model_news'); $GLOBALS['TCA']['tx_myextension_domain_model_news'] = [ 'ctrl' => [ 'title' => 'LLL:EXT:my_extension/Resources/Private/Language/locallang_db.xlf:tx_myextension_domain_model_news', 'label' => 'title', 'delete' => 'deleted', 'enablecolumns' => ['disabled' => 'hidden'], 'iconfile' => 'EXT:my_extension/Resources/Public/Icons/news.svg', ], 'types' => ['1' => ['showitem' => 'title, content, hidden']], 'columns' => [ 'hidden' => [ 'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.enabled', 'config' => ['type' => 'check', 'renderType' => 'checkboxToggle'], ], 'title' => [ 'label' => 'LLL:EXT:my_extension/Resources/Private/Language/locallang_db.xlf:tx_myextension_domain_model_news.title', 'config' => ['type' => 'input', 'eval' => 'trim,required'], ], 'content' => [ 'label' => 'LLL:EXT:my_extension/Resources/Private/Language/locallang_db.xlf:tx_myextension_domain_model_news.content', 'config' => ['type' => 'text', 'rows' => 15], ], ], ];
三、页面展示数据
- 创建Fluid模板
在Resources/Private/Templates/News/List.html中编写展示模板:
<h1>News List</h1> <ul> <f:for each="{newsItems}" as="news"> <li> <h2>{news.title}</h2> <p>{news.content}</p> <f:link.action action="edit" arguments="{news: news}">Edit</f:link.action> <f:link.action action="delete" arguments="{news: news}" confirmation="Are you sure?">Delete</f:link.action> </li> </f:for> </ul> <f:link.action action="new">Add News</f:link.action>
- 配置前台插件
在TYPO3后台创建页面,添加「插件」内容元素,选择my_extension的「News List」插件,保存后访问页面即可看到数据列表。
内容的提问来源于stack exchange,提问作者bwfront
相关产品推荐
相关产品推荐

