Witam
To znowu ja :D, po ostatnim moim poście z ocena skryptu logowania postanowiłem poszukać jeszcze w internecie informacji jak dobrze pisać obiektowo, jak na razie nie pisałem jeszcze ze wzorcem projektowym postanowiłem napisać w czystym OOP, poczytałem też o zasadzie SOLID, myślę że chociaż trochę z tego skorzystałem, ale mam 1 wątpliwość co do zasady w której kod powinien być "otwarta na rozbudowe i zamknięta na modyfikacje" czy do tego zalicza się dodanie odwołania do wykonana funkcji w już istniejącej i np. chciałbym dodać do metody verification skrypt który zablokuje konto jeżeli ktoś wpisze 4 razy błędne hasło, i dodam samo odwołanie $this->funkcja(); to złamie wtedy zasadę "open/close principle"?
DBmanager.php
<?php
class DBmanager
{
private $db_host = "localhost";
private $db_user = "root";
private $db_password = "";
private $db_name;
private $db_connect;
public function __construct($db_name = "test")
{
$this->db_connect = new mysqli($this->db_host, $this->db_user, $this->db_password, "$db_name");
}
public function checkConnection()
{
if($this->db_connect->connect_errno)
{
throw new Exception($this->db_connect->connect_errno);
}
else
{
return $this->db_connect;
}
}
public function closeConnection($connect)
{
$connect->close();
}
}
?>
AuthC.php
<?php
class AuthC
{
private $login;
private $password;
private $password2;
public function login($login, $password)
{
$this->login = htmlentities($login);
$this->password = htmlentities($password);
$vlogin = new VerificationLogin();
try
{
return $vlogin->verification($this->login, $this->password);
}
catch(Exception $e)
{
$_SESSION['exceptionLogin'] = $e->getMessage();
return DATABASE_ERROR;
}
}
}
?>
VerificationLogin.php
<?php
class VerificationLogin
{
private $login;
private $password;
private $DBmanager;
public function __construct()
{
$this->DBmanager = new DBmanager();
}
public function verification($login, $password)
{
$connect = $this->DBmanager->checkConnection();
$this->login = $connect->real_escape_string($login);
$this->password = $password;
$query = $connect->query("SELECT id, login, password, last_login FROM users WHERE login='$this->login'");
if($query->num_rows >= 1)
{
$row = $query->fetch_assoc();
if(password_verify($this->password, $row['password']))
{
$_SESSION['logged'] = true;
$_SESSION['idUser'] = $row['id'];
$_SESSION['login'] = $row['login'];
$_SESSION['lastLogin'] = $row['last_login'];
return LOGIN_SUCCESS;
}
else
{
$_SESSION['rememberLogin'] = $this->login;
$_SESSION['viewPasswordError'] = true;
return false;
}
}
else
{
return LOGIN_FAILED;
}
$this->DBmanager->closeConnection($connect);
}
}
?>
index.php
session_start();
require_once('class/ClassLoader.php');
require_once('constants.php');
$AuthC = new AuthC();
if(isset($_POST['login']))
{
if((empty($_POST['login'])) || (empty($_POST['password'])))
{
$_SESSION['viewLoginError'] = true;
$_SESSION['viewPasswordError'] = true;
}
else
{
switch($AuthC->login($_POST['login'], $_POST['password']))
{
case LOGIN_SUCCESS:
header('Location: templates/informations.php');
break;
case LOGIN_FAILED:
$_SESSION['viewLoginError'] = true;
break;
case DATABASE_ERROR:
$_SESSION['viewExceptionLogin'] = true;
break;
}
}
}