你该知道的8个配置项:eloquent-taggable自定义分隔符、连接与表名完整清单
【免费下载链接】eloquent-taggableEasily add the ability to tag your Eloquent models in Laravel.项目地址: https://gitcode.com/gh_mirrors/el/eloquent-taggable
eloquent-taggable 是一个轻量级 Laravel 插件,让你轻松为 Eloquent 模型添加标签功能。本文带你盘点 taggable.php 配置文件中的 8 个核心配置项,覆盖自定义分隔符、连接字符、表名等场景,帮你一次掌握 eloquent-taggable 配置完整清单。
💡 什么是 eloquent-taggable?
一句话:让 Laravel 模型"拥有标签能力"。给模型引入 Taggable 这个 Trait,就能用tag()、untag()等方法为文章、商品等数据打标签,并用查询范围(Scope)快速筛选"带某标签"的记录。
所有行为都可以通过一份配置文件集中调整。这份文件位于app/config/taggable.php,默认值集中在 README.md 的 Configuration 章节,下面带你逐项拆解。
📋 8 个配置项一览
| 配置项 | 默认值 | 作用 |
|---|---|---|
delimiters | ,, | 拆分标签的分隔符 |
glue | , | 拼接tagList的连接字符 |
normalizer | mb_strtolower | 标签规范化函数 |
connection | null | Tag 模型数据库连接 |
throwEmptyExceptions | false | 空值查询异常开关 |
taggedModels | [] | 标签反向关系映射 |
model | Tag::class | 自定义 Tag 模型类 |
tables | 两张表 | 自定义数据库表名 |
💡 前 3 项控制"标签怎么存、怎么显示",后 5 项控制"标签存在哪里、如何扩展"。
🔍 逐项详解
1️⃣ delimiters:自定义标签分隔符
默认只认英文逗号。但如果你希望同时接受/、;、|等多种分隔符,把它们都塞进这个字符串即可。
'delimiters' => '/;,|'设置后即可这样调用:
$model->tag('Apple;Banana/Cherry,Durian|Etrog'); // 自动拆成 5 个标签该行为在 CustomDelimiterTests.php 中有完整验证,支持任意多个单字符分隔符。
2️⃣ glue:自定义标签连接字符
delimiters负责"拆开"标签,glue则负责"拼回去"——它决定了读取$model->tagList字符串时用哪个字符连接各标签。
'glue' => '.'此时:
$model->tag('Apple,Banana,Cherry'); echo $model->tagList; // 输出 Apple.Banana.Cherry对应验证见 CustomGlueTests.php,对规范化后的tagListNormalized同样生效。
3️⃣ normalizer:自定义标签规范化函数
标签入库前会先经过一个"规范化"函数处理,目的是避免Apple、APPLE、apple变成三个重复标签。默认使用 PHP 内置的mb_strtolower(全部转小写)。
你可以换成任意"接收一个字符串、返回一个字符串"的函数或闭包:
'normalizer' => ['Illuminate\Support\Str', 'slug'] // 生成 URL 友好的 slug自定义闭包示例(测试中甚至用它反转字符串做验证)见 CustomNormalizerTests.php。
4️⃣ connection:切换数据库连接
若你的标签表存放在独立数据库,把connection设为对应的连接名即可:
'connection' => 'tags_db'留空(null)时,Tag 模型会跟随应用默认的config('database.default')连接,绝大多数场景无需改动。
5️⃣ throwEmptyExceptions:空值查询异常开关
当你给查询范围传入空字符串时,逻辑上"没有任何标签可匹配"。这个开关决定库如何反应:
false(默认):直接返回空结果,代码更简洁;true:抛出 NoTagsSpecifiedException,便于你在代码中捕获并自定义提示。
'throwEmptyExceptions' => true行为差异可参考 ScopeExceptionTests.php。
6️⃣ taggedModels:标签反向关系映射
默认只能"由模型找标签"。若想反过来"由标签找所有带该标签的模型",需在此登记反向关系——键为关系名,值为对应的模型类:
'taggedModels' => [ 'posts' => \App\Post::class, ]之后即可一行取数:
$posts = Tag::findByName('Apple')->posts; // 所有带 Apple 标签的文章7️⃣ model:自定义 Tag 模型类
默认使用插件内置的 Tag 模型。若你想加字段或行为,继承它并在配置中指向自己的类即可:
'model' => \App\Models\CustomTag::class插件内的服务与迁移都会自动读取该配置,见 TagService.php。
8️⃣ tables:自定义数据库表名
插件默认创建taggable_tags与taggable_taggables两张表。若表名冲突或想按规范重命名,修改tables即可,模型、服务、迁移会同步读取:
'tables' => [ 'taggable_tags' => 'custom_tags', 'taggable_taggables' => 'custom_taggables', ]重命名后打标签功能依然正常,验证见 CustomTableTests.php。
⚙️ 如何修改配置
三步搞定:
发布配置文件到
app/config/taggable.php:php artisan vendor:publish --provider="Cviebrock\EloquentTaggable\ServiceProvider" --tag "config"按需修改上述 8 项,其余保持默认。
若改动了
tables或迁移,记得重新执行php artisan migrate建表。
配置文件由 ServiceProvider.php 负责发布与合并,改动后无需额外注册。
✅ 配置建议小结
- 只改分隔符/连接符?优先动
delimiters与glue,最直观。 - 想避免重复标签?
normalizer保持默认mb_strtolower通常就够。 - 涉及多数据库、重命名表或自定义模型?再考虑
connection、tables、model。
掌握这份清单,你就能按项目需要灵活定制 eloquent-taggable 的每一个细节,无需改动任何源码。
【免费下载链接】eloquent-taggableEasily add the ability to tag your Eloquent models in Laravel.项目地址: https://gitcode.com/gh_mirrors/el/eloquent-taggable
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考