Взаимодействие контроллера и модели? Функция авторизации из контроллера:// Авторизовать юзера с помощью электронной почты
public function maillogin()
{
$POST = $_POST;
$POST['mail'] = trim($POST['mail']);
$validate = new Validator();
if(!empty($_POST['mail']) && !empty($_POST['pwd']) && $validate->correctMail($_POST['mail']) === true){
// В модель ничего не передаётся т.к. она возьмёт данные из POST
$data = $this->userModel->{__FUNCTION__}();
if($data === 'WrongPassword'){
$view = new ErrorView();
$view->wrongPwd();
}
elseif($data === 'WrongLogin') {
$view = new ErrorView();
$view->wrongLogin();
}
} else {
$view = new ErrorView();
$view->noData();
}
}
Фрагмент этой же функции из модели:if(password_verify($POST['pwd'], $pwd[0]['pwd'])){
$_SESSION['ok'] = 'Вы успешно авторизованы';
header("Location: {$_SERVER['HTTP_REFERER']}");
die();
}
Вопросы по этому коду:1. Метод maillogin() существует и в контроллере и в модели, нормально ли это, или лучше сделать mailloginController() и mailloginModel()2. Если пользователь залогинится успешно, то метод в модели как видно не возвращает true, там же в модели создаётся сессия и юзер отправляется на страницу откуда пришёл. Это плохо? Надо вернуть true и редиректить в контроллере?3. Создав экземпляр класса new ErrorView() заранее, например, там же где new Validator() я смогу сократить код ниже, а не писать создание экземпляра в каждом if но если всё пройдёт ок, то он потребуется и это будет напрасная трата памяти. Как лучше делать в этом случае?4. die() в модели мне не нравится, но чем заменить его не знаю, как обычно делают в таких случаях?
Ну и если любые другие замечания будут - рад услышать.

21 Авг 2019 в 06:59
233 +1
1
Ответы
1

Не рекомендуется именовать методы одинаково в контроллере и модели, чтобы избежать путаницы. Лучше назвать методы соответственно контексту, например, mailloginController() в контроллере и mailloginModel() в модели.

В данном случае, когда успешная авторизация происходит в модели, можно вернуть какое-то значение (например, true), чтобы контроллер мог обработать это значение и выполнить необходимые действия (например, редирект). Это поможет разделить логику авторизации и действия, которые должны быть выполнены после нее.

Для оптимизации кода и избегания повторения создания экземпляра объекта можно создать его заранее и передавать по необходимости в функции или методы. Также можно использовать Dependency Injection для передачи объектов в конструкторы классов, чтобы избежать создания их внутри методов.

Вместо использования функции die() в модели, рекомендуется возвращать какое-то значение (например, сообщение об ошибке) и обрабатывать его в контроллере. Можно также выбросить исключение и обработать его в контроллере.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир