我已将laravel默认 make:Auth 更新为使用用户名和电子邮件登录。 我只是在
中有覆盖用户名功能loginController.php to:
public function username()
{
$loginType = request()->input('username');
$this->username = filter_var($loginType , FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$this->username => $loginType]);
$this->property_exists($this, 'username') ? $this->username : 'email';
}
但收到了错误:
Method [property_exists] does not exist on [App\Http\Controllers\Auth\LoginController].
答案 0 :(得分:0)
property_exists
是一个php函数,而不是某个类的方法。因此,要改善此错误,只需重写代码:
public function username()
{
$loginType = request()->input('username');
$this->username = filter_var($loginType , FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$this->username => $loginType]);
property_exists($this, 'username') ? $this->username : 'email';
}
答案 1 :(得分:0)
property_exists - 检查对象或类是否具有属性
bool property_exists(混合$ class,字符串$ property)
public function username()
{
$loginType = request()->input('username');
$this->username = filter_var($loginType , FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$this->username => $loginType]);
property_exists($this, 'username') ? $this->username : 'email';
}
答案 2 :(得分:-1)
LoginController中的username()
方法是指请求发送的用户名字段名称。在您的情况下,我会想象字段名称是相同的,但是您使用该字段查找电子邮件或用户名的变化是什么。在这种情况下,你应该能够"欺骗"用户提供程序通过覆盖LoginController中的credentials
方法来执行此操作(并且不要覆盖username
函数):
protected function credentials(Request $request)
{
$v = \Validator::make($request->only($this->username()), [
$this->username() => "email"
]);
if ($v->passes()) {
return [
"email" => $request->input($this->username()),
"password" => $request->input("password")
];
} else {
return [
"username" => $request->input($this->username()),
"password" => $request->input("password")
];
}
}
这将传递给用户提供商,用户提供商将根据email
列或username
列选择用户,具体取决于传递的内容。