在 Laravel 中自定义手机号格式化方法,需通过以下步骤实现标准化处理:
步骤 1:创建格式化方法
在 LoginController
中添加 formatPhone
方法,用于清理和标准化手机号:
// app/Http/Controllers/Auth/LoginController.php
use Illuminate\Http\Request;
private function formatPhone(string $input): string
{
// 移除非数字字符(如空格、横杠、括号等)
$cleaned = preg_replace('/\D/', '', $input);
// 处理中国手机号(假设系统默认使用+86)
if (strlen($cleaned) === 11 && str_starts_with($cleaned, '1')) {
return '+86' . $cleaned;
}
// 处理带国家码但省略了+的情况(例如 8612345678901)
if (strlen($cleaned) > 11 && str_starts_with($cleaned, '86')) {
return '+' . $cleaned;
}
// 其他情况直接返回带+的 cleaned(如用户输入+441234567890)
return '+' . $cleaned;
}
步骤 2:在登录逻辑中调用格式化方法
修改 credentials
方法,在检测到手机号登录时应用格式化:
// app/Http/Controllers/Auth/LoginController.php
protected function credentials(Request $request)
{
$login = $request->input('login');
if (filter_var($login, FILTER_VALIDATE_EMAIL)) {
$field = 'email';
} else {
$field = 'phone';
$login = $this->formatPhone($login); // 调用格式化方法
}
return [
$field => $login,
'password' => $request->input('password'),
];
}
步骤 3:数据库存储格式统一
确保 users
表中的手机号字段 (phone
) 存储的是 国际标准化格式(如 +8613123456789
),可通过迁移文件设置:
// database/migrations/xxxx_create_users_table.php
Schema::create('users', function (Blueprint $table) {
$table->string('phone')->unique()->nullable();
});
步骤 4:验证与测试
测试不同输入格式是否被正确转换:
用户输入 | 格式化后结果 | 说明 |
---|---|---|
13812345678 | +8613812345678 | 补全国家码 |
+8613812345678 | +8613812345678 | 直接保留 |
08613812345678 | +8613812345678 | 清理前缀0并补国家码 |
(86)138-1234-5678 | +8613812345678 | 清理符号后补国家码 |
+447912345678 | +447912345678 | 保留其他国家的国际格式 |
步骤 5:可选增强功能
1. 格式验证(注册/登录时)
在注册或登录请求中增加手机号格式验证规则:
// app/Http/Requests/RegisterRequest.php
public function rules()
{
return [
'phone' => 'sometimes|string|regex:/^\+\d{8,15}$/',
];
}
2. 错误提示友好化
在语言文件 (resources/lang/xx/auth.php
) 中自定义错误消息:
'invalid_phone' => '手机号格式无效,应为国际格式(如 +8613123456789)',
总结
通过以上步骤,你可以实现:
- 输入清理:移除所有非数字符号(如空格、横杠)。
- 智能补全国家码:自动为11位中国手机号添加
+86
。 - 国际化支持:保留其他国家的国际格式(如
+44...
)。 - 数据库兼容:确保存储格式统一,避免登录匹配失败。
此方法能灵活处理用户输入的各种手机号格式,提升登录体验的鲁棒性。