Laravel 6.* 实现用户名/邮箱/手机号登录时Blade报语法错误
报错直接原因
当前的syntax error, unexpected '<'是Blade模板语法非法触发的原生PHP解析错误,核心问题包括:
- 误用无效Blade语法:
@error->has()不属于Blade支持的写法,Blade原生@error是模板指令,不支持链式调用对象方法 - 多个逻辑判断条件之间漏写逻辑或运算符
||,PHP解析器遇到无连接符的代码段时,会撞上Blade编译生成的带<标记的HTML边界内容,直接抛出语法错误 - 表单参数命名逻辑混乱:前端尝试分离传递
phone/email/name三个参数,但Laravel自带的Auth逻辑根本不会接收这类分离值,就算语法不报错也无法完成登录匹配
可直接运行的完整调整方案
1. 修正前端登录页表单代码
将原有输入框所在的表单组,替换为如下代码(去掉冗余的参数判断,统一用单个login字段传递用户输入的账号值):
<div class="form-group row"> <label for="login" class="col-md-4 col-form-label text-md-right">账号</label> <div class="col-md-6"> <input id="login" type="text" class="form-control @error('login') is-invalid @enderror" name="login" value="{{ old('login') }}" required autofocus placeholder="请输入手机号、邮箱或用户名" > @error('login') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div>
注意:不要保留原来的
type="email"限制,不然浏览器会强制校验输入值为邮箱格式,手机号、用户名根本没法提交。
2. 调整后端认证逻辑
Laravel 6 自带的认证逻辑默认仅匹配email字段登录,需要重写对应方法适配多字段匹配:
打开app/Http/Controllers/Auth/LoginController.php,新增两个重写方法:
// 重写凭证匹配规则,根据用户输入的内容自动匹配对应数据库字段 protected function credentials(\Illuminate\Http\Request $request) { $loginInput = $request->get('login'); // 识别输入内容类型:邮箱、手机号、用户名 $matchField = filter_var($loginInput, FILTER_VALIDATE_EMAIL) ? 'email' : (preg_match('/^1[3-9]\d{9}$/', $loginInput) ? 'phone' : 'name'); // 返回匹配条件,密码校验逻辑不变 return [ $matchField => $loginInput, 'password' => $request->get('password') ]; } // 指定登录表单的参数字段名,适配错误提示的绑定 public function username() { return 'login'; }
3. 模型属性适配
打开app/User.php,确保新增的phone字段已经加入可批量赋值属性数组,避免赋值异常:
protected $fillable = [ 'name', 'email', 'phone', 'password', ];
常见踩坑提醒
- 调整完成后需要清理一次模板缓存:执行
php artisan view:clear,避免旧的编译模板残留导致报错 - 不要在Blade里把多个
@error指令直接并列写,比如@error('a') @error('b'),编译后会因为缺少逻辑运算符直接触发和你现在一模一样的语法错误,正确写法是统一监听单个login字段的错误提示即可 - 确保数据库里的
phone字段加了唯一索引,不然相同手机号的多个账号会导致认证逻辑报错
内容的提问来源于stack exchange,提问作者Arian Kapllanaj
相关产品推荐
相关产品推荐

