Laravel模型属性翻译优化:无需在控制器重复编写__()代码
在Laravel模型中自动翻译属性,避免重复代码
嘿,这个需求太贴合实际了——谁也不想在每个控制器、每个视图里重复写__()来翻译模型属性对吧?咱们直接在模型层面把这个逻辑封装好,一劳永逸!下面给你几个实用的方案,按需选就行:
方案1:使用Laravel访问器(Accessor)
这是最直接的方式,针对单个属性定义访问器,当你获取该属性时自动返回翻译后的内容。
比如你有个Product模型,其中status字段存储的是active/inactive这类英文标识,想要自动翻译为对应语言:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 定义status属性的访问器 public function getStatusAttribute($value) { // 这里的翻译键可以根据你的项目结构调整,比如绑定到product模块下的status节点 return __("product.status.$value"); } }
这样一来,无论你在控制器还是视图里调用$product->status,拿到的直接就是翻译后的文本,完全不用再额外写翻译逻辑!
方案2:批量处理多个需翻译的属性
如果你的模型有多个属性需要翻译,一个个写访问器太麻烦,可以重写getAttribute方法,批量处理指定属性:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 在这里列出所有需要自动翻译的属性 protected $translatableAttributes = ['status', 'type', 'category']; public function getAttribute($key) { // 先获取原始属性值 $value = parent::getAttribute($key); // 如果当前属性在翻译列表里,就返回翻译后的值 if (in_array($key, $this->translatableAttributes)) { return __("product.$key.$value"); } // 其他属性返回原始值 return $value; } }
以后要新增翻译属性,只需要往$translatableAttributes数组里加就行,非常省心。
方案3:保留原始值,同时提供翻译后的属性
有时候你可能既需要原始值(比如做逻辑判断),又需要翻译后的值(比如页面展示),这种情况可以定义带后缀的访问器:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 定义翻译后的status属性 public function getTranslatedStatusAttribute() { return __("product.status.$this->status"); } // 同理可以给其他属性加翻译访问器 public function getTranslatedTypeAttribute() { return __("product.type.$this->type"); } }
使用的时候,$product->status还是原始的标识值,$product->translated_status就是翻译后的文本,兼顾了两种需求。
最后别忘了配置翻译文件
要让翻译生效,你需要在resources/lang目录下的对应语言文件夹里创建翻译文件,比如resources/lang/zh-CN/product.php:
return [ 'status' => [ 'active' => '活跃', 'inactive' => '停用', 'draft' => '草稿' ], 'type' => [ 'physical' => '实物商品', 'digital' => '虚拟商品' ] ];
这样整个流程就通了,所有使用该模型的地方都不用重复写翻译代码,逻辑完全封装在模型里~
内容的提问来源于stack exchange,提问作者oofy
相关产品推荐
相关产品推荐

