Based on the Single Responsibility Principle, I have been looking at my User class, trying to figure out how I can break out more functionality into separate classes.
But it seems like all the functions I have belong in the User class.
Such as login and registerUser. I'm not sure it would make sense to create a class just for logging in users. That functionality would belong in the User class, correct?
Same with registerUser. Would it really make sense to create a class just for that action? That wouldn't seem very object oriented to me.
Any ideas on how I could make this abide by the SRP a bit more would be great.
I am used to OOP. And doing things like separating functions from a class to put inside their own class seems a bit strange, and not OOP like.
That is what I have read much of what to do. Separate code into it's own class.
Here is my code, so you can have a look:
class User extends Person
{
private static $instance;
private function __construct()
{
$this->ID = $_SESSION['userID'];
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new User();
}
return self::$instance;
}
function login($email, $password)
{
global $databaseTest;
$results = $databaseTest->callProc("getUserLogin", array($email), PDO::FETCH_OBJ);
$data = $results['data'][0];
if (count((array)$data) >= 1) { //Email exists in database
if (password_verify($password, $data->password)) {
if ($data->userActive == "Y") {
$_SESSION['userID'] = $data->userid;
$_SESSION['email'] = $data->email;
$_SESSION['firstname'] = $data->firstname;
$_SESSION['lastname'] = $data->lastname;
return array('status' => "success");
} else {
return array('status' => "email-notConfirmed");
}
} else {
return array('status' => "password-incorrect");
}
} else { //Email doesn't exist in database
return array('status' => "email-notFound");
}
}
function setActive()
{
global $databaseTest;
$results = $databaseTest->callProc("setUserActive", array($this->ID), PDO::FETCH_OBJ);
//Return
$string = ($results['status'] == "success") ? "success" : "failure";
return array("status" => $string);
}
function setInactive()
{
global $databaseTest;
$results = $databaseTest->callProc("setUserInActive", array($this->ID), PDO::FETCH_OBJ);
//Return
$string = ($results['status'] == "success") ? "success" : "failure";
return array("status" => $string);
}
function setProfilePic($imgSrc)
{
/* Large */
$path = "c:/webroot/supplyIt/images/users/large/" . $_SESSION['userID'] . ".jpg";
$status = base64_saveAsJPG($imgSrc, $path, 500, 500);
if ($status == "success") {
/* Medium */
$path = "c:/webroot/supplyIt/images/users/medium/" . $_SESSION['userID'] . ".jpg";
base64_saveAsJPG($imgSrc, $path, 200, 200);
/* Small */
$path = "c:/webroot/supplyIt/images/users/small/" . $_SESSION['userID'] . ".jpg";
base64_saveAsJPG($imgSrc, $path, 50, 50);
return array("status" => "success");
} else {
return array("status" => "failure");
}
}
function registerUser($firstname, $lastname, $email, $password, $gender)
{
if (empty($firstname)) return array('status' => "fn-empty");
if (strlen($firstname) > 30) return array('status' => "fn-tooLong");
if (empty($lastname)) return array('status' => "ln-empty");
if (strlen($lastname) > 30) return array('status' => "ln-tooLong");
if (empty($email)) return array('status' => "email-empty");
if (strlen($email) > 100) return array('status' => "email-tooLong");
if (empty($password)) return array('status' => "password-empty");
if (strlen($password) < 6) return array('status' => "password-tooShort");
if (strlen($password) > 50) return array('status' => "password-tooLong");
if (strpos($email, '@') === false) return array('status' => "email-invalid");
if (strpos($email, '.') === false) return array('status' => "email-invalid");
if (empty($gender)) return array('status' => "gender-empty");
global $databaseTest;
$results = $databaseTest->callProc("getUser", array($email), PDO::FETCH_OBJ);
if (count($results['data']) >= 1) return array('status' => "email-alreadyRegistered");
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$array = array(
$firstname,
$lastname,
$email,
$hashedPassword,
$gender
);
$results = $databaseTest->callProc("registerInsert", $array, PDO::FETCH_OBJ);
//Return
$string = ($results['status'] == "success") ? "success" : "failure";
return array("status" => $string);
}
}