Я пытаюсь выполнить проверку учетной записи электронной почты.
Если пользователь не подтвердил свое электронное письмо, они все равно могут войти в систему, но не могут получить доступ к каким-либо действиям в модуле account , Например, если они пытаются получить доступ:
/account/profile/edit /account/listing/add, он должен перенаправить пользователя на /account/default/confirm, в котором отображается сообщение:
«Вы еще не подтвердили свою учетную запись, нажмите ссылку в подтверждающем письме или нажмите здесь, чтобы отправить письмо с подтверждением».Я пробовал следующее:
BaseController:
class BaseController extends Controller
{
protected function findUser($id)
{
if (($model = User::findOne(['id' => $id, 'deleted_at' => null])) !== null) {
if ($model->confirmed_at == null) {
return $this->redirect(['/account/default/confirm']);
}
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
ProfileController:
class ProfileController extends BaseController
{
public function actionEdit()
{
$user = $this->findUser(Yii::$app->user->id);
$profile = $user->profile; // getProfile() relation in User model
return $this->render('index', [
'profile' => $profile,
]);
}
}
Проблема я что это дает мне ошибку:
«Вы еще не подтвердили свою учетную запись, нажмите ссылку в электронном подтверждении или нажмите здесь, чтобы отправить письмо с подтверждением».
«Попытка получить профиль свойства« не-объекта ».
Я думаю, что причина ошибки заключается в том, что она, похоже, назначает перенаправление на $user, вместо фактического завершения запроса при перенаправлении.
$this->redirect() вернет объект ответа - он выглядит очень плохой дизайн, если такой метод может вернуть полностью несвязанный объект (Response или User). Вероятно, вы должны вызвать Application::end(), чтобы завершить приложение, поэтому перенаправление вступит в силу без продолжения выполнения действия контроллера.
protected function findUser($id) {
if (($model = User::findOne(['id' => $id, 'deleted_at' => null])) !== null) {
if ($model->confirmed_at == null) {
$this->redirect(['/account/default/confirm']);
Yii::$app->end();
}
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
Здесь попробуйте проверить !empty() перед доступом $model, например
class BaseController extends Controller
{
protected function findUser($id)
{
if (($model = User::findOne(['id' => $id, 'deleted_at' => null])) !== null) {
if (!empty($model->confirmed_at)) {
return $model;
}
return $this->redirect(['/account/default/confirm']);
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}