如何为数组元素的类型字段添加可链式调用的翻译方法
技术百科
心靈之曲
发布时间:2025-12-29
浏览: 次 本文介绍在 laravel 中为模型属性(如 `$exam->type`)添加 `->translate()` 链式调用方法的完整实现方案,包括在 eloquent 模型中定义访问器、使用关联数组替代嵌套三元运算符提升可读性与健壮性,并确保支持默认回退值。
要在 Laravel 中实现 $exam->type->translate() 这样的链式调用语法,关键在于将 type 字段设计为一个支持方法调用的对象(即“值对象”),而非原始字符串。但更符合 Laravel 习惯、简洁且高效的做法是:不改变 $exam->type 的原始类型(string),而是通过模型访问器(accessor)提供一个便捷的 typeTranslate 属性,或直接在模型中定义一个 getTranslatedTypeAttribute() 方法,最终以 $exam->translatedType 或 $exam->typeTranslate 的方式调用。若坚持链式语法(如 $exam->type()->translate()),则需将 type 封装为可调用对象——但该方案过度设计,不推荐。
✅ 推荐方案:在 Exam 模型中定义访问器(Accessor)
在 app/Models/Exam.php 中添加如下代码:
// app/Models/Exam.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Exam extends Model
{
// 定义翻译映射表(私有静态属性,避免重复初始化)
protected static $typeTranslations = [
'math' => 'ماث',
'iq' => 'آيكيو',
'geo' => 'هندسة',
'gen' => 'شامل',
];
// 定义访问器:$exam->translatedType 或 $exam->typeTranslate
public function getTranslatedTypeAttribute()
{
$type = $this->attributes['type'] ?? '';
return static::$typeTranslations[$type] ?? 'غير معرّف';
}
// (可选)提供一个显式方法,支持链式风格语义:$exam->translateType()
public function translateType()
{
return $this->translatedType;
}
}✅ 模板中使用方式(简洁清晰):
{{-- Blade 模板中 --}}
考试类型:{{ $exam->translatedType }}
{{-- 或 --}}
考试类型:{{ $exam->translateType() }}
⚠️ 为什么不建议 $exam->type->translate()?
因为 $exam->type 默认是字符串(string),而字符串在 PHP 中不支持方法调用。强行实现需将 type 改为自定义类实例(如 TypeValue 对象),并重载 __call(),这会增加复杂度、破坏数据一致性,且违背 Laravel 的约定优于配置原则。
? 进阶建议:使用 Laravel 原生翻译系统(强烈推荐)
将类型映射移至语言文件,便于多语言维护和团队协作:
-
创建语言文件 resources/lang/ar/exam.php:
'ماث', 'iq'
=> 'آيكيو',
'geo' => 'هندسة',
'gen' => 'شامل',
'undefined' => 'غير معرّف',
]; -
在模型中调用:
public function getTranslatedTypeAttribute() { $key = $this->attributes['type'] ?? 'undefined'; return __($key, [], 'ar', 'exam') ?: __('undefined', [], 'ar', 'exam'); }
✅ 总结
- ✅ 将翻译逻辑封装在 Exam 模型中(非 Controller),保障复用性与单一职责;
- ✅ 使用关联数组替代嵌套三元运算符,提升可读性、可维护性,并兼容 PHP 7.4+ 及 PHP 8+;
- ✅ 优先采用 Laravel 翻译系统(__()),为未来国际化(i18n)预留扩展空间;
- ❌ 避免强行模拟 $exam->type->translate() 链式调用,除非有强约束场景且已充分评估成本。
# 可选
# 提供一个
# 链式
# 多语言
# 进阶
# 自定义
# 这会
# 而非
# 要在
# app
# 对象
# String
# 字符串
# access
# 为什么
# ar
# 封装
# php
# 运算符
# 访问器
# laravel
# 强烈推荐
# 关联数组
# 三元运算符
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- 如何使用Golang指针与接口结合_实现方法调用和
- Win11怎么打开注册表_Windows 11注册
- Win11声音太小怎么办_Windows 11开启
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Windows10怎么查看硬件信息_Windows
- Win11怎么关闭搜索历史_Win11清除设备上的
- Windows怎样拦截QQ浏览器广告_Window
- Win11怎么设置开机问候语_自定义Win11锁屏
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- 如何在Golang中写入JSON文件_保存结构体数
- Win11怎么设置任务栏透明_Windows11使
- Windows电脑如何截屏?(四种快捷方法)
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- Win11怎么设置任务栏大小_Windows11注
- Win10路由器怎么隐藏ssid Win10隐藏w
- Python网络超时处理_健壮性设计说明【指导】
- MySQL 中使用 IF 和 CASE 实现查询字
- Mac系统更新下载慢或失败怎么办_解决macOS升
- 如何在Golang中配置代码格式化工具_使用gof
- c++中如何进行二进制文件读写_c++ read与
- Win11如何关闭游戏模式 Win11禁用Xbox
- Win10如何优化内存使用_Win10内存优化技巧
- PHP主流架构怎么部署到Docker_容器化流程【
- Win11怎么设置虚拟内存_Windows 11优
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- 如何在包含多值的列中精准搜索指定演员?
- Drupal 中 HTML 链接被双重转义导致渲染
- c++ namespace命名空间用法_c++避免
- 如何在Golang中优化文件读写性能_使用缓冲和并
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- Python文件管理规范_工程实践说明【指导】
- 如何使用Golang实现错误包装与传递_Golan
- 手机php文件怎么变成mp4_安卓苹果打开php转
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- php增删改查在php8里有什么变化_新特性对cu
- 如何在 Go 结构体中正确初始化 map 字段
- Dapper的Execute方法的返回值是什么意思
- windows如何修改文件默认打开方式_windo
- Mac如何使用听写功能_Mac语音输入打字【效率技
- Win11怎样激活系统密钥_Win11系统密钥激活
- Python技术债务管理_长期维护解析【教程】
- 短链接怎么用php还原_从基础原理到代码实现教学【
- php下载安装后swoole扩展怎么安装_异步框架
- Linux怎么查找死循环进程_Linux系统负载分
- Windows 10怎么录屏_Windows 10
- php订单日志怎么记录发货_php记录订单发货操作
- 如何使用Golang指针与结构体结合_修改结构体内

=> 'آيكيو',
'geo' => 'هندسة',
'gen' => 'شامل',
'undefined' => 'غير معرّف',
];
QQ客服