You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel Nova资源索引页自定义修改求助:显示分类名称及多语言切换实现

解决方案:Laravel Nova 替换分类ID为名称 + 多语言切换实现

一、把索引页的分类ID换成分类名称

先假设你的业务模型(比如Post文章)和Category分类是一对多关联(一篇文章属于一个分类),咱们一步步来改:

1. 先确认模型关联没问题

打开你的业务模型文件(比如app/Models/Post.php),确保已经定义了和分类的关联:

public function category()
{
    return $this->belongsTo(Category::class);
}

如果还没加,补上这个关联方法就行。

2. 修改Nova资源的字段配置

找到对应的Nova资源文件(比如app/Nova/Post.php),找到原来显示category_id的字段,直接替换成关联字段就行:

// 先删掉原来显示ID的字段,比如:
// Text::make('Category ID', 'category_id'),

// 换成BelongsTo关联字段,指定显示分类名称
BelongsTo::make('Category', 'category')
    ->displayUsing(fn ($category) => $category?->category_name) // 这里直接取分类的category_name字段
    ->sortable(), // 可选:如果需要按分类名称排序,加上这个

要是你不想用关联字段,就想在普通文本字段里显示名称,也可以这么写:

Text::make('Category', function () {
    // 关联存在的话就显示名称,否则显示空或者默认值
    return $this->category?->category_name ?? 'Uncategorized';
})->sortable(),

这样刷新Nova的索引页,就能看到分类名称代替原来的ID了。

二、实现En/RU多语言切换

Nova本身支持多语言,咱们可以做个简单的切换按钮来实现需求:

1. 准备语言文件

先在resources/lang目录下新建ru文件夹,把en目录里的Nova相关语言文件复制过去,然后把里面的英文内容翻译成俄语。比如:

  • resources/lang/ru/nova.php:这个是Nova自带的界面文本,比如“Create”“Update”这些按钮的文字
  • 如果你自己的业务模型有自定义语言,也可以在ru目录下新建对应的文件,比如resources/lang/ru/posts.php

2. 做个自定义Nova工具放切换按钮

先执行命令生成一个自定义工具:

php artisan nova:tool your-name/lang-switcher

your-name换成你的名字或者项目标识就行。

然后打开工具目录下的resources/js/components/Tool.vue,替换成下面的代码:

<template>
    <div class="flex items-center space-x-2 p-2">
        <button @click="switchLang('en')" class="px-3 py-1 bg-gray-200 rounded-md hover:bg-gray-300 transition-colors">En</button>
        <button @click="switchLang('ru')" class="px-3 py-1 bg-gray-200 rounded-md hover:bg-gray-300 transition-colors">RU</button>
    </div>
</template>

<script>
export default {
    methods: {
        switchLang(locale) {
            // 发请求给后端切换语言
            axios.post('/nova/lang-switch', { locale })
                .then(() => {
                    // 刷新页面让语言生效
                    window.location.reload();
                });
        }
    }
}
</script>

3. 加后端路由和语言切换逻辑

打开routes/web.php,添加一个处理语言切换的路由:

use Illuminate\Support\Facades\Session;
use Illuminate\Http\Request;

Route::post('/nova/lang-switch', function (Request $request) {
    // 验证语言参数只能是en或ru
    $validated = $request->validate(['locale' => 'required|in:en,ru']);
    // 把语言存在session里
    Session::put('locale', $validated['locale']);
    // 设置当前应用语言
    app()->setLocale($validated['locale']);
    
    return response()->json(['success' => true]);
})->middleware(['nova']); // 只允许Nova登录用户访问

然后在app/Providers/AppServiceProvider.phpboot方法里,设置每次请求的默认语言:

public function boot()
{
    // 如果session里有保存的语言,就用这个语言
    if (Session::has('locale')) {
        app()->setLocale(Session::get('locale'));
    }
}

4. 把工具注册到Nova里

打开app/Providers/NovaServiceProvider.php,在tools方法里注册咱们的语言切换工具:

use YourName\LangSwitcher\LangSwitcher; // 注意替换成你生成的工具命名空间

public function tools()
{
    return [
        new LangSwitcher,
    ];
}

最后执行npm run dev编译前端资源,刷新Nova页面,就能在侧边栏顶部看到En和RU的切换按钮了,点击就能切换语言。


内容的提问来源于stack exchange,提问作者codeurient

火山引擎 最新活动