今天在使用微博登录拓展时发现,微博用户的用户名多为中文,而Flarum又不支持中文用户名注册。

我找到的对于中文用户名注册的解决方法是这样的:

/vendor/flarum/core/src/User/UserValidator.php中约47行的

'regex:/^[a-z0-9_-]+$/i',

更改为:

'regex:/^[-_a-zA-Z0-9\x7f-\xff]+$/i',

再将/vendor/flarum/core/src/Forum/Auth/Registration.php中约101行的

$username = preg_replace('/[^a-z0-9-_]/i', '', $username);

注释掉,成为:

// $username = preg_replace('/[^a-z0-9-_]/i', '', $username);

随后,你会发现无法at中文用户名的用户、进入中文用户名的用户个人主页会出现“找不到此资源”的问题。

为了支持at中文用户名的用户,需要将/vendor/flarum/mentions/src/ConfigureMentions.php中约53行的

$config->Preg->match('/\B@(?<username>[a-z0-9_-]+)(?!#)/i', $tagName);

修改为:

$config->Preg->match('/\B@(?<username>[\p{L}\p{N}_-]+)(?!#)/ui', $tagName);

将约91行的

$config->Preg->match('/\B@(?<username>[a-z0-9_-]+)(?!#)/i', $tagName);

修改为:

$config->Preg->match('/\B@(?<username>[\p{L}\p{N}_-]+)#(?<id>\d+)/ui', $tagName);

这样就成功的支持了at中文用户名的用户。

QQ截图20200805211148.png

下面是解决“找不到此资源”问题的方法:
/vendor/flarum/core/src/Api/Controller/ShowUserController.php中约52行的

$id = $this->users->getIdForUsername($id);

修改为:

$id = $this->users->getIdForUsername(urldecode($id));

这样,Flarum论坛就完全支持中文用户名的使用了!

我这个代码高亮太瞎眼了