05. Abstraktā modeļu klase

Ir skaidrs, ka veids, kā tikko pieslēdzāmies datu bāzei un uzrakstījām SQL vaicājumu tieši kontrolierī nav īsti feins - tas noteikti neatbilst Model - View - Controller jeb MVC pieejai. Tieši tāpēc projektā jāievieš modeļi!

Tas, ko vēlamies panākt, ir, lai BlogController metodē index()var uzrakstīt tikai statisku metodes izsaukumu $posts = Blog::all() un visi bloga ieraksti tiek saglabāti mainīgajā!

  1. Izveido direktoriju models

    Ar visiem modeļiem parasti tiek veiktas līdzīgas darbības, kas atbilst CRUD. Lai metodes nevajadzētu atkārtot, šis ir labs piemērs mantošanai!

  2. Izveido datni Model.php
  3. Datnē pieprasi datubāzi un izveido tukšu abstraktu klasi:
    
    <?php
    require "Database.php";
    
    abstract class Model {
    }
                   

    Abstrakta klase ir tāda klase, kura pati par sevi nevar pastāvēt - tā ir tikai kā paraugs tām klasēm, kas mantos visas protected un public īpašības un metodes no šīs klases. Abstraktu klasi PHP veido ar atslēgvārdu abstract

  4. Klasē izveido aizsargātu, statisku īpašību $db:
    
    protected static $db;
                    

    Statiska īpašība vai metode ir tāda, kurai nevajag klases objektu jeb instanci, lai tā pastāvētu un to varētu izsaukt. Statiskas īpašības un metodes PHP veido ar atslēgvārdu static

  5. Lai datu bāzei pieslēgtos tikai vienu reizi, definē init() metodi:
    
    public static function init() {
      if (!self::$db) {
        self::$db = new Database();
      }
    }
                  

    init() metode palīdz panākt Singleton Pattern - izsauc cik gribi, bet iegūsti vienu. Šis ir ļoti interesants temats, par ko vērts parunāt ar ChatGPT!

  6. Izveido abstraktu, aizsargātu, statisku metodi, kas pieprasa obligātu tabulas vārdu, kad tiek izveidots modelis:
    
    abstract protected static function getTableName(): string;
                    
    • abstract - visām atvasinātajām klasēm (visiem modeļiem) obligāti jādefinē šī metode, tātad arī obligāti jānorāda, pie kādas datu bāzes tabulas pieslēgties
    • protected - modifikators, kurš nosaka, ka šī metode ir tikai pieejama no atvasinātajām klasēm, bet ne no ārpuses
    • static - šī metode ir statiska, tai nevajag klases objektu vai instanci, jo viss modelis, piemēram, Blog vēlēsies sazināties tikai un vienīgi ar vienu un to pašu tabulu blog
    • : string - uzspiež, ka metode obligāti atgriež simbolu virkni
  7. Visbeidzot izveido pirmo publisko (jebkur izsaucamo) modeļu metodi all(), kas iegūst visus tabulas ierakstus no datu bāzes:
    
    public static function all() {
      self::init();
      $sql = "SELECT * FROM " . static::getTableName();
    
      $records = self::$db->query($sql)->fetchAll();
      return  $records;
    }
                  
    • self::init(); - uztaisa vai pārliecinās, ka ir savienojums ar datu bāzi
    • iegūst SQL vaicājumu ar pareizo tabulas nosaukumu, ko iegūst no atvasinātās klases
    • Iegūst visus ierakstus no datu bāzēs tabulas
    • Atgriež visus ierakstus