cocur/slugify中文转slug为空主因是未启用mbstring/intl扩展或未设locale='zh';PHP需≥7.4,Docker需手动安装intl,Laravel应绑定服务容器复用。

cocur/slugify能解决 URL 友好别名问题,但**装上就用、不配 locale 和扩展,中文一定为空**——这不是 bug,是设计使然。
composer require cocur/slugify 为什么报错或没效果?
常见报错如 Your requirements could not be resolved 或运行后中文返回空字符串,基本都卡在这三处:
-
php -v小于 7.4 → 直接拒绝安装,换 PHP 版本或改用javiereguiluz/easyslugger(兼容更低版本) -
php -m | grep mbstring无输出 → 中文处理失效,需在php.ini中启用extension=mbstring -
php -m | grep intl无输出 →locale配置无效,中文无法转拼音,结果为空或只剩标点
Docker 用户注意:php:8.2-cli 镜像默认不带 intl,得加 docker-php-ext-install intl。
中文转 slug 总是为空?必须显式设 locale
cocur/slugify 默认只认 ASCII,对中文“视而不见”。不设 locale,它连尝试都不会做。
正确初始化方式:
$slugify = new \Cocur\Slugify\Slugify(['locale' => 'zh']);
echo $slugify->slugify('你好世界'); // 输出:ni-hao-shi-jie
注意:'zh_CN'、'zh-Hans' 这类写法无效,必须用 'zh';Windows 下若 intl 确实不可用,可临时用 iconv('UTF-8', 'ASCII//TRANSLIT', $str) 预处理,但拼音不准、丢字多,仅作兜底。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
生成的 slug 带下划线、数字或大小写混乱?检查配置项和规则顺序
默认行为是:空格→-,中文→拼音(需 intl),标点→删,数字→保留,字母→小写。所有“异常”基本来自手动干预不当:
- 看到下划线?不是默认行为,是你传了
separator => '_'或调用了slugify($str, '_') - 数字没被删?这个库默认不删数字,要删得加规则:
$slugify->addRule('/[0-9]+/', '') - 大小写不对?检查是否启用了
lowercase => false,或规则里写了'I' => 'i'类替换 - 规则执行顺序很重要:
addRule()是追加,先加的先执行,比如想先删数字再转拼音,就得先把数字规则加在前面
Laravel 项目里怎么避免每次 new 实例?
直接 new Slugify() 能用,但不推荐。Laravel 项目应绑定到服务容器,方便复用和测试:
// 在 AppServiceProvider::register() 中
$this->app->singleton(\Cocur\Slugify\Slugify::class, function () {
return new \Cocur\Slugify\Slugify(['locale' => 'zh']);
});
然后 anywhere 都能 app(\Cocur\Slugify\Slugify::class)->slugify(...);如果要用 Facade,得额外注册别名,但多数场景没必要——依赖注入更清晰。
真正容易被忽略的是:locale 必须在实例化时传入,不能靠 setLocale() 后补;intl 扩展未启用时,setLocale() 调用完全静默失败,没有任何 warning。










