В DataMapper под модель картографа домен


Я только недавно узнал о данных мапперы', который позволяет данным быть переданными в классы без классов, зная, откуда берутся данные, так вот моя попытка написать одно:

index.php

include 'classes/db.php';
include 'classes/usermapper.php';
include 'classes/user.php';

$user = new User;
$userMapper = new userMapper;

try {
  $user->setData([
    $userMapper->fetchData([
      'username'=>'peter1'
    ])
  ]);
} catch (Exception $e) {
  die('Error occurred');
}

if ($user->hasData()) {
  echo $user->fullName();
}

classes/user.php

class User {
  private $_data;

  public function __construct() { }

  public function setData($userObject = null) {
    if (!$userObject) { throw new InvalidArgumentException('No Data Set'); }
    $this->_data = $dataObject;
  }

  public function hasData() {
    return (!$this->_data) ? false : true;
  }

  public function fullName() {
    return ucwords($this->_data->firstname.' '.$this->_data->lastname);
  }
}

classes/usermapper.php

class userMapper {
  private $_db;

  public function __construct() { $this->_db = DB::getInstance(); }

  public function fetchData($where = null) {
    if (!is_array($where)) { 
      throw new InvalidArgumentException('Invalid Params Supplied'); 
    }

    $toFill = null;
    $toSanitize = [];

    foreach($where as $argument=>$value) {
      $toFill .= $argument.' = ? AND ';
      array_push($toSanitize, $value);
    }

    $query = sprintf("SELECT * FROM `users` WHERE %s ", substr(rtrim($toFill), 0, -3));


    $result = $this->_db->queryn($query, $toSanitize);

    return $result;
  }
}

classes/db.php

class DB {
  private static $_instance = null;
  private $_pdo,
          $_query,
          $_error = false,
          $_results,
          $_count = 0;

  private function __construct() {
    try {
      $this->_pdo = new PDO("mysql:host=localhost;dbname=dbname", "username", "password");
    } catch (PDOException $e) {
      die('DATABASE ERROR. SOMETHING HAS GONE WRONG.');
    }
  }

  public static function getInstance() {
    if (!isset(self::$_instance)) {
      self::$_instance = new DB();
    }
    return self::$_instance;
  }

  public function queryn($query = null, $pA = array(), $esp = false, $enr = false, $tdb = false, $rid = false) {
    if (!$query) {
      throw new InvalidArgumentException('Misconfigured Parameters. Need $query, $pA [Array], $esp [true/false], $enr [true/false], $tdb [true/false]');
    }

    /* FILL IN BLANKS */
    if (!$esp) {
      $esp = false;
    }
    if (!$enr) {
      $enr = false;
    }
    if (!$pA) {
      $pA = [];
    }
    if (!$tdb) {
      $tdb = false;
    }

    /* PREPARE QUERY AND BIND PARAMS */
    if ($this->_query = $this->_pdo->prepare($query)) {
      for ($i=0; $i < count($pA); $i++) {
      if (is_string($pA[$i])) {
            $type = PDO::PARAM_STR;
        } else if (is_int($pA[$i])) {
            $type = PDO::PARAM_INT;
        } else if (is_bool($pA[$i])) {
            $type = PDO::PARAM_BOOL;
        } else if (is_float($pA[$i])) {
            $type = PDO::PARAM_STR;
        } else {
            $type = PDO::PARAM_NULL;
        }
        $this->_query->bindValue($i+1, $pA[$i], $type);
      }

      /* CHECK EXECUTION SUCCESS */
      if (!$this->_query->execute()) {
        throw new Exception('Query Failed to Execute');
      }

      /* SET ROW COUNT */
      $this->_count = $this->_query->rowCount();

      /* FOR EXPECTING NO RESULTS */
      if ($enr === true) {
        if ($this->_query->rowCount() == 0) {
          return true;
        } else {
          return false;
        }
      }

      if ($tdb === true) {
        if ($this->_query->rowCount() == 0) {
          throw new Exception('No DB Item Changed.');
        }
      }

      /* RETURNS NULL WITH NO RETURN RESULTS */
      if ($this->_query->rowCount() == 0) {
        return null;
      }

      /* RETURN DATA BASED ON ESR [ExpectSingleResult] */
      if ($esp === false) {
        $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
      } else {
        $this->_results = $this->_query->fetch(PDO::FETCH_OBJ);
      }

      /* Return Results */
      if ($rid === true) {
        return ((int)$this->_pdo->lastInsertId() === 0) ? null : $this->_pdo->lastInsertId();
      } else {
        return $this->_results;
      }


    } else {
      throw new Exception('Failed to Prepare Query.');
    }
  }

Я спрашиваю, является ли этот код может быть улучшен в общем-то, и я заинтересован в частности, можно ли ее оптимизировать. Таким образом, я не придется создавать отдельный класс маппер для каждой сущности, как они все кажутся одинаковыми для меня, много дублирующегося кода.



140
2
задан 1 марта 2018 в 04:03 Источник Поделиться
Комментарии