
在使用 cakephp 3 的 `translatebeh*ior` 时,当用户在非默认语言环境下创建实体,可能会导致默认语言对应的实体字段为空。这会造成 cms 中出现“幽灵”实体,影响数据完整性。本文将介绍如何通过自定义 `translatebeh*ior`,重写 `afters*e` 事件,在保存非默认语言翻译后,自动填充默认语言实体中为空的字段,从而确保多语言数据的一致性。
CakePHP 3 的 TranslateBeh*ior 提供了强大的多语言支持,允许为模型中的特定字段存储多种语言的翻译。然而,一个常见的问题是,当网站的当前语言不是默认语言时,如果此时创建一个新的实体并保存,那么默认语言对应的实体记录中的翻译字段可能会保持为空。例如,如果默认语言是英语,当前语言是法语,当用户在法语环境下创建一个产品实体时,该产品的英语名称、描述等字段在数据库中会是 NULL。这在内容管理系统中会造成困扰,因为开发者会看到许多“空”的默认语言实体,影响数据管理和显示。
为了解决上述问题,我们可以通过扩展 CakePHP 3 默认的 TranslateBeh*ior,并重写其 afterS*e 事件。在 afterS*e 事件中,我们检查当前保存的实体是否为非默认语言的翻译。如果是,并且默认语言的对应字段为空,我们就将当前语言的翻译内容填充到默认语言的实体中。
首先,创建一个自定义的 TranslateBeh*ior 类,例如 App\Model\Beh*ior\TranslateBeh*ior.php,并让它继承 Cake\ORM\Beh*ior\TranslateBeh*ior:
<?php
namespace App\Model\Beh*ior;
use Cake\Datasource\EntityInterface;
use Cake\Event\Event;
use Cake\I18n\I18n;
use Cake\ORM\Beh*ior\TranslateBeh*ior as BaseTranslateBeh*ior;
use Cake\ORM\TableRegistry;
/**
* 自定义 Translate 行为
* 目的:在非默认语言下保存实体时,如果默认语言实体字段为空,则用当前翻译填充。
*/
class TranslateBeh*ior extends BaseTranslateBeh*ior
{
/**
* 在保存后填充原始(未翻译)实体,如果原始字段严格为 null。
*
* @param Event $event 触发的 afterS*e 事件
* @param EntityInterface $entity 已翻译的实体
* @return void
*/
public function afterS*e(Event $event, EntityInterface $entity)
{
// 调用父类的 afterS*e 方法,确保默认的多语言逻辑被执行
parent::afterS*e($event, $entity);
$defaultLocale = I18n::getDefaultLocale(); // 获取默认语言环境
$currentLocale = I18n::getLocale(); // 获取当前语言环境
// 如果当前语言环境就是默认语言环境,则无需特殊处理,直接返回
if ($currentLocale === $defaultLocale) {
return;
}
// 获取原始实体对应的 Table 对象
$table = TableRegistry::getTableLocator()->get($entity->getSource());
// 临时将 Table 的语言环境设置为默认语言,以便获取默认语言的实体
$table->setLocale($defaultLocale);
// 根据实体的主键获取默认语言的原始实体
$originalEntity = $table->get($entity->{$table->getPrimaryKey()});
// 遍历行为配置中定义的可翻译字段
$fields = $this->_config['fields'];
foreach ($fields as $field) {
// 如果原始实体的该字段严格为 null,则用当前翻译的字段值填充
if ($originalEntity->{$field} === null) {
$originalEntity->{$field} = $entity->{$field};
}
}
// 临时移除 Table 上的 Translate 行为,防止在保存 originalEntity 时触发递归
// 因为 originalEntity 的保存也会再次触发 afterS*e 事件
$table->removeBeh*ior('Translate');
// 保存更新后的原始实体
$table->s*e($originalEntity);
// 重新添加 Translate 行为,并使用之前的配置
$table->addBeh*ior('Translate', $this->_config);
// 将 Table 的语言环境设置回当前语言
$table->setLocale($currentLocale);
}
}代码解析:
要使用这个自定义的 TranslateBeh*ior,你需要在你的 Table 类中加载它,替换掉默认的 TranslateBeh*ior。
会译·对照式翻译
会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译
79
查看详情
例如,在你的 App\Model\Table\ArticlesTable.php 中:
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function initialize(array $config): void
{
parent::initialize($config);
$this->setTable('articles');
$this->setDisplayField('title');
$this->setPrimaryKey('id');
// 加载自定义的 TranslateBeh*ior
// 替换掉默认的 'Translate'
$this->addBeh*ior('App\Model\Beh*ior\Translate', [
'fields' => ['title', 'body'], // 指定需要翻译的字段
// 其他 TranslateBeh*ior 配置...
]);
// ... 其他行为和关联
}
}请确保在 addBeh*ior 中指定了 fields 选项,列出所有需要进行多语言翻译的字段,这些字段将在 afterS*e 方法中被遍历和检查。
通过实现这个自定义的 TranslateBeh*ior,你可以有效解决 CakePHP 3 在非默认语言环境下保存实体时,默认语言实体字段为空的问题,从而构建一个更加健壮和用户友好的多语言应用程序。
以上就是CakePHP 3 多语言行为:解决非默认语言保存导致原始实体为空的问题的详细内容,更多请关注php中文网其它相关文章!
# cms
# app
# 多语言
# php
# 创建一个
# 英语
# 法语
# 重写
# 遍历
# 这是
# 自定义
# 为空
# 递归
# 常见问题
# 汕头企业网站建设电话
# 南宫微网站建设
# seo标记
# 滨州seo生产厂家
# 网站排名优化专业公司
# 海南绍兴网站推广
# 富阳网站建设报价
# 惠州网站内页优化
# 鹤壁专业建设网站
# 德州全网seo方案
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道
微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】
excel怎么制作考勤表 excel考勤模板与函数公式讲解
VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略
iCloud官方网站 iCloud网页版在线登录入口
《下一站江湖2》独孤剑诀习得方法
惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置
byrutor直接访问入口 byrutor官方游戏库
Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置
pubmed数据库官方主页_pubmed学术论文查找官网直达
iPhone14开启Apple TV遥控设置
Win10截图远程协助 Win10远程桌面截屏法【场景应用】
Win11怎么开启HDR_Windows 11显示器画质增强设置
Go语言反射机制下访问嵌入结构体中的被遮蔽方法
《小宇宙》标记不友善评论方法
奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧
《米姆米姆哈》米姆获取及技能攻略
poki官网最新入口 poki小游戏大全入口
Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件
阿里云共享相册入口在哪
如何使用 Optional 类型并满足 Pylint 的类型检查
三角洲行动2025年9月10日摩斯密码分享
网页版网易云音乐入口_网易云音乐在线官网登录
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
掌握产品代码正则表达式:避免常见陷阱与精确匹配
我的世界游戏平台入口 我的世界官方官网直达链接
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
PHP多语言网站的实现:会话管理与翻译函数优化教程
win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】
wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式
电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】
解决Windows上Composer PATH变量冲突导致的命令无法识别问题
《火影忍者:木叶高手》快速升级攻略
口腔诊所管理软件推荐
微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程
Linux如何优化系统启动流程_Linux启动项优化方案
Lar*el 中高效执行多列更新:单次查询实现
哔哩哔哩在线观看入口 B站官网免费进入
京东快递包裹信息查询入口 京东快递官方查询平台入口
《金山词霸》语音翻译方法
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
汽水音乐车机版 汽水音乐车机版官方入口
Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践
江苏大剧院会员卡购买步骤
CSS过渡与滚动滚动事件结合应用_scroll与transition动画
@Team是什么?揭秘团队含义
Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程
mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法
TikTok网页版实时观看入口 TikTok网页版短视频在线浏览
小红书网页版首页入口 小红书网页版电脑端官方登录链接
2025-11-21
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。