我正在尝试重置密码,但收到错误消息“试图获取非对象的属性”。 我还附上了我的错误的屏幕截图,请查看它。
我的控制器用于重置密码:
class ResetPasswordController extends Controller
{
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function showResetForm(Request $request, $token = null)
{
return view('auth.passwords.reset')->with(
['token' => $token, 'email' => $request->email]
);
}
public function reset(Request $request)
{
try {
$password = $this->user->where('id', Auth::user()->id)->value('password');
if(Hash::check($request->input('current_password'),$password)) {
$this->user->where('id', Auth::user()->id)->update(['password' => bcrypt($request->input('new_password'))]);
$token = $request->header('Authorization');
JWT::invalidate($token);
Auth::logout();
return response(['status' => true, 'message' => 'Password changed successfully'], 200);
} else {
return response(['status' => false, 'message' => 'The Current Password is invalid.'], 200);
}
} catch (\Exception $ex) {
return response(['status' => false, 'message' => $ex->getMessage()], 500);
}
}
}
我的路线配置:
\Illuminate\Support\Facades\Auth::routes();
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.request');
我的视图模板:
<form action="{{ route('password.request') }}" method="post">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="login-form-email">Current Password</label>
<input type="password" class="form-control" name="current_password" id="login-form-password" tabindex="2" placeholder="Current Password" tabindex="4">
</div>
<div class="form-group">
<label for="login-form-password">New password</label>
<input type="password" class="form-control" name="new_password" id="login-form-password" tabindex="2" placeholder="New Password" tabindex="4">
</div><!-- /.form-group -->
<div class="form-group">
<label for="login-form-password-retype">Confirm new password</label>
<input type="password" class="form-control" name="new_password_confirmation" id="login-form-password-retype" tabindex="3" placeholder="Confirm password">
</div><!-- /.form-group -->
<div class="form-group">
<input type="submit" class="btn btn-primary pull-right" name="reset-confirm" id="reset-confirm" tabindex="4" value="Reset Password">
</div>
有人基于此代码和错误消息有解决方案吗?非常感谢您的帮助!
答案 0 :(得分:0)
您的第一个问题在这里:
public function __construct(User $user)
您正在注入用户,但它不知道要使用哪个用户,除非这来自中间件。因此,构造函数不应该接受用户,也不需要保护成员。如果您确实希望将其作为受保护的成员,则可以 执行以下操作:
public function __construct()
{
$this->user = Auth::user();
}
但是由于您拥有Auth::user()
,因此您不需要它作为成员。
where
是静态的你有
$this->user->where('id', Auth::user()->id)->value('password')
模型的where
函数是静态函数,不应在单个对象上调用它。相反,您应该使用范围运算符(::
)来调用它。那时大多数版本的PHP都会出错。从数据库中获取当前用户的密码哈希的正确方法是:
$hash = Auth::user()->password;
如果您有一个ID,则可以:
$hash = User::where('id','=',$userId)->get()->password;
如果您保留该用户为会员(反对推荐),但按照此答案的上述部分进行了操作,则可以:
$hash = $this->user->password
最后,现代版本的Laravel中的Auth模块已经在app\Http\Controllers\Auth
中为您解决了这一问题。为什么要重新发明轮子?