请问如何优化这段代码
public function resetPassword($email,$verifyCode,$newPassword)
{
$user = User::findByEmail($email)->first();
if ($user) {
$codeData = EmailVerifyLog::findByEmail($email)->get()->last();
if($codeData){
if ($codeData->verifyCode($verifyCode) && $codeData->notExpired()) {
$user->updatePassword($newPassword);
$codeData->updateToExpired();
return true;
}
}
}
return false;
}
调用这个函数的是controller,这里需要用到User和EmailVerifyLog两个对象。
这里加了if判断对象是为了防止执行方法会报错。
但是这样每取一个对象就要判断一次,那就可能会有无数个if,我自己想到的方案有:
1、两个对象同时取同时判断,就少了一个if了,但是如果email不存在,可能会多执行一次查询
2、在控制器获取对象并判断,把对象传进来,这个函数就负责执行函数就行了
请问大家有没有其他方案?
高认可度评论:
尽量提前 return
自定义validator,查询用户是否存在,或者查询邮件里验证码是否和入参一致其他地方应该也能用到
$user = User::findByEmail($email)->first(); 这个应该可以在验证器里面验证
$codeData = EmailVerifyLog::findByEmail($email)->get()->last(); 放到中间件
first可以优化为,嫌麻烦可以再封装一下
下面那个获取log直接倒序first就好了
提前 return 掉
快速入门《Laravel 9 中文文档》
尽量提前 return
文档:快速入门《Laravel 9 中文文档》
判断条件不多的话,感觉没必要过分优化
$user = User::findByEmail($email)->first();只是查询存在的话可以换成 $user = User::findByEmail($email)->exists();和doesntExist();
最有必要优化的就是如下语句
改为
考量的點在於,會先驗證 email,所以 email 相關的會先處理過關 之後才將 user 抓取出來做處理
如果需要返回true false 加个try catch