За последние 24 часа нас посетил 36781 программист и 7753 робота. Сейчас ищут 1722 программиста ...

Класс для объекта с данными из БД

Тема в разделе "PHP для новичков", создана пользователем Khvrus, 23 янв 2023.

  1. Khvrus

    Khvrus Новичок

    С нами с:
    23 янв 2023
    Сообщения:
    2
    Симпатии:
    0
    Добрый день. Прошу помощи. Только начал вникать в ООП. Необходим класс для сущностей которые по факту представляют из себя набор данных из БД (сейчас MySQL, в дальнейшем источник данных может измениться). На основе нескольких вариантов подхода к данной задаче из различных источников в интернет родился класс, точнее набор классов для казалось бы простой задачи выдернуть данные для конструктора класса из БД. Вопрос к практикам, на сколько оправдан данный вариант реализации или эта задача должна решаться иным способом?

    Base.php
    PHP:
    1. declare(strict_types=1);
    2.  
    3. namespace Portal;
    4.  
    5. class Base {
    6.  
    7.     private int $id;
    8.     private string $fullName;
    9.     private string $shortName;
    10.     private int $hidden;
    11.  
    12.     public function __construct(int $id, string $fullName, string $shortName, int $hidden){
    13.         $this->id        =  $id;
    14.         $this->fullName  =  $fullName;
    15.         $this->shortName =  $shortName;
    16.         $this->hidden    =  $hidden;
    17.     }
    18.  
    19.     public static function fromState(array $state): Base{
    20.         return new self(
    21.             $state['id'],
    22.             $state['fullName'],
    23.             $state['shortName'],
    24.             $state['hidden'],
    25.         );
    26.     }  
    27.  
    28.     public function id(){
    29.         return $this->id;
    30.     }  
    31.  
    32.     public function fullName(){
    33.         return $this->fullName;
    34.     }
    35.  
    36.     public function shortName(){
    37.         return $this->shortName;
    38.     }
    39.  
    40.     public function isHidden(){
    41.         return $this->hidden;
    42.     }
    IBaseStorage.php
    PHP:
    1. declare(strict_types=1);
    2.  
    3. namespace Portal;
    4.  
    5. interface IBaseStorage{
    6.  
    7.     public function findById(int $id);
    8.     public function findByName(string $name);
    9.     public function findByShortName(string $name);
    10.     public function save(string $shortName, string $fullName, int $hidden);
    11.     public function update(int $id, string $fullName, string $shortName, int $hidden);
    BaseMapper.php
    PHP:
    1. declare(strict_types=1);
    2.  
    3. namespace Portal;
    4.  
    5. use InvalidArgumentException;
    6.  
    7. class BaseMapper{
    8.  
    9.      public function __construct(IBaseStorage $adapter){
    10.         $this->adapter = $adapter;
    11.     }
    12.  
    13.     public function findById(int $id): Base{
    14.         $result = $this->adapter->findById($id);
    15.         if (!$result):
    16.             throw new InvalidArgumentException("Record not found (params: id#$id)");
    17.         endif;
    18.         return $this->mapRowToBase($result);
    19.     }
    20.  
    21.     public function findByFullName(string $fullName): Base{
    22.         $result = $this->adapter->findByName($fullName);
    23.         if (!$result):
    24.             throw new InvalidArgumentException("Record not found (params: fullName#$fullName)");
    25.         endif;
    26.         return $this->mapRowToBase($result);
    27.     }
    28.  
    29.     public function findByShortName(string $shortName): Base{
    30.         $result = $this->adapter->findByShortName($shortName);
    31.         if (!$result):
    32.             throw new InvalidArgumentException("Record not found (params: shortName#$shortName)");
    33.         endif;
    34.         return $this->mapRowToBase($result);
    35.     }
    36.  
    37.     public function save(string $shortName, string $fullName, int $hidden): Base{
    38.         $data = $this->adapter->findByShortName($shortName);
    39.         if($data === false):
    40.             $result = $this->adapter->save($shortName, $fullName, $hidden);
    41.             if (!$result):
    42.                 throw new InvalidArgumentException("Record not created, arguments error (params: fullName#$fullName, shortName#$shortName, hidden#$hidden");
    43.             endif;
    44.         else:
    45.             throw new InvalidArgumentException("Record not created, record already exists, shortName must be unique (params: fullName#$fullName, shortName#$shortName, hidden#$hidden");
    46.         endif;  
    47.         return $this->mapRowToBase($result);
    48.     }
    49.  
    50.     public function update(Base $instance, string $shortName, string $fullName, int $hidden): Base{
    51.         $id = $instance->id();
    52.         $data = $this->adapter->findByShortName($shortName);
    53.         if((is_array($data) && ($data['id'] == $id)) || ($data === false)):
    54.             $result = $this->adapter->update($id, $shortName, $fullName, $hidden);
    55.             if ($result === false):
    56.                 throw new InvalidArgumentException("Record not update, arguments error (params: id#$id, fullName#$fullName, shortName#$shortName, hidden#$hidden");
    57.             endif;
    58.         else:
    59.             throw new InvalidArgumentException("Record not update, record already exists (params: id#$id, fullName#$fullName, shortName#$shortName, hidden#$hidden");
    60.         endif;
    61.         return $this->mapRowToBase($result);
    62.     }    
    63.  
    64.     private function mapRowToBase(array $row): Base{
    65.         return Base::fromState($row);
    66.     }
    PdoBaseStorage.php
    PHP:
    1. declare(strict_types=1);
    2.  
    3. namespace Portal;
    4.  
    5. use PDO;
    6. use \Db;
    7. use InvalidArgumentException;
    8.  
    9. class PdoBaseStorage implements IBaseStorage
    10. {
    11.  
    12.     private $dbConnect;
    13.  
    14.     public function __construct($db){
    15.         $this->dbConnect = $db;
    16.     }
    17.  
    18.     public function findById(int $id){
    19.         $sql = "SELECT `id`, `name`, `short_name`, `hidden` FROM `portal_base` WHERE `id` = :id LIMIT 1";
    20.         $stmnt = $this->dbConnect->prepare($sql);
    21.         $stmnt->bindParam(":id", $id, PDO::PARAM_INT);
    22.         $stmnt->execute();
    23.         $result = $stmnt->fetch(PDO::FETCH_ASSOC);
    24.         if($result):
    25.             $data = array(
    26.                 'id'        =>  $result['id'],
    27.                 'fullName'  =>  $result['name'],
    28.                 'shortName' =>  $result['short_name'],
    29.                 'hidden'    =>  $result['hidden'],
    30.             );
    31.             return $data;
    32.         else:
    33.             return false;
    34.         endif;
    35.     }
    36.  
    37.     public function findByName(string $name){
    38.         $sql = "SELECT `id`, `name`, `short_name`, `hidden` FROM `portal_base` WHERE `name` = :name LIMIT 1";
    39.         $stmnt = $this->dbConnect->prepare($sql);
    40.         $stmnt->bindParam(":name", $name, PDO::PARAM_STR);
    41.         $stmnt->execute();
    42.         $result = $stmnt->fetch(PDO::FETCH_ASSOC);
    43.         if($result):
    44.             $data = array(
    45.                 'id'        =>  $result['id'],
    46.                 'fullName'  =>  $result['name'],
    47.                 'shortName' =>  $result['short_name'],
    48.                 'hidden'    =>  $result['hidden'],
    49.             );
    50.             return $data;
    51.         else:
    52.             return false;
    53.         endif;
    54.     }
    55.  
    56.     public function findByShortName(string $name){
    57.         $sql = "SELECT `id`, `name`, `short_name`, `hidden` FROM `portal_base` WHERE `short_name` = :name LIMIT 1";
    58.         $stmnt = $this->dbConnect->prepare($sql);
    59.         $stmnt->bindParam(":name", $name, PDO::PARAM_STR);
    60.         $stmnt->execute();
    61.         $result = $stmnt->fetch(PDO::FETCH_ASSOC);
    62.         if($result):
    63.             $data = array(
    64.                 'id'        =>  $result['id'],
    65.                 'fullName'  =>  $result['name'],
    66.                 'shortName' =>  $result['short_name'],
    67.                 'hidden'    =>  $result['hidden'],
    68.             );
    69.             return $data;
    70.         else:
    71.             return false;
    72.         endif;
    73.     }
    74.  
    75.     public function update(int $id, string $shortName, string $fullName, int $hidden){
    76.             $sql = "UPDATE `portal_base` SET `short_name` = :shortName, `name` = :fullName, `hidden` = :hidden WHERE `id` = :id";
    77.             $stmnt = $this->dbConnect->prepare($sql);
    78.             $stmnt->bindParam(":id", $id, PDO::PARAM_INT);
    79.             $stmnt->bindParam(":fullName", $fullName, PDO::PARAM_STR);
    80.             $stmnt->bindParam(":shortName", $shortName, PDO::PARAM_STR);
    81.             $stmnt->bindParam(":hidden", $hidden, PDO::PARAM_INT);
    82.             if ($stmnt->execute()):
    83.                 return $this->findById($id);
    84.             else:
    85.                 return false;
    86.             endif;
    87.     }
    88.  
    89.  
    90.     public function save(string $shortName, string $fullName, int $hidden){
    91.         if($this->findByShortName($shortName) === false):
    92.             $sql = "INSERT INTO `portal_base`(`id`, `short_name`, `name`, `hidden`) VALUES (null, :shortName, :fullName, :hidden)";
    93.             $stmnt = $this->dbConnect->prepare($sql);
    94.             $stmnt->bindParam(":fullName", $fullName, PDO::PARAM_STR);
    95.             $stmnt->bindParam(":shortName", $shortName, PDO::PARAM_STR);
    96.             $stmnt->bindParam(":hidden", $hidden, PDO::PARAM_INT);
    97.             if ($stmnt->execute()):
    98.                 $result = $this->findById((int)$this->dbConnect->lastInsertId());
    99.             else:
    100.                 return false;
    101.             endif;
    102.             return $result;
    103.         else:
    104.             return false;
    105.         endif;
    106.     }  
    Ну и код создания объекта в приложении
    PHP:
    1. $baseMapper = new BaseMapper(new PdobaseStorage($dbgConnect));
    2. $obj_base_1 = $baseMapper->findByShortName('PAP');
    3. echo sprintf('obgId:%d--ID:%d----ShortName: %s----FullName: %s<br/>', spl_object_id($obj_base_1), $obj_base_1->id(), $obj_base_1->shortName(), $obj_base_1->fullName());