classes/bfw/core/Entity.php
author Markus Bröker <broeker.markus@googlemail.com>
Fri, 13 Nov 2015 03:24:01 +0100
changeset 7 3ed6f90e97d9
child 8 54ea0099329c
permissions -rw-r--r--
Überarbeitete MVC-Struktur, die ich jetzt auch nachvollziehen kann.

<?php

/**
 * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
 *
 */

namespace bfw\core;

use bfw\database\Database;
use Logger;

/**
 * Class Entity
 *
 * Entity besitzt einen State in $data
 *
 *
 * @method string getId()
 * @method setId($param)
 */
class Entity {
    protected $logger = null;

    protected $table;
    protected $db;

    protected $data;

    /**
     * @param $table
     */
    public function __construct($table) {
        $this->logger = Logger::getLogger('__CLASS__');

        $this->db = Database::getInstance();

        $this->table = $table;
        $this->data = array();
    }

    /**
     * <b>Herzstück des Persistence-Frameworks</b>
     *
     * Dynamische Erzeugung von Getttern- und Settern
     *
     * Anstatt diese explizit zu pflegen und zu warten,
     * werden Diese dynamisch, on, the fly, erzeugt.
     *
     * <b>Der Vorteil: Nicht Konfigurieren, nicht Erzeugen. Einfach Nutzen...</b>
     *
     * @param $methodName
     * @param null $params
     * @return $this
     */
    public function __call($methodName, $params = null) {
        $prefix = substr($methodName, 0, 3);
        $key = strtolower(substr($methodName, 3));

        if ($prefix == 'set') {
            $value = $params[0];

            // no data, no state, null
            if (!is_array($this->data)) {
                return null;
            }

            $this->data[$key] = $value;

            // fluent please!
            return $this;

        } else if ($prefix == 'get') {

            // no data, no state, null
            if (!is_array($this->data)) {
                return null;
            }

            if (array_key_exists($key, $this->data)) {
                return $this->data[$key];
            }
        }

        exit(sprintf('Unbekannte Methode %s::%s(%s, %s) wurde aufgerufen.', get_class($this), $methodName, $key, $prefix));
    }

    /**
     * <b>Vereinfachte Find Methode bezogen auf die jeweilige Instanz</b>
     *
     * @param $id
     * @return Model
     */
    public function find($id) {
        $this->logger->info(sprintf('%s(%d) ', __METHOD__, $id));

        if (($this->data = $this->db->find($this->table, $id)) == null) {
            return null;
        }

        return $this;
    }

    /**
     * <b>Die Findall Methode erzeugt typsicher den Supertyp</b>
     *
     * @param bool|false $sys
     * @return Model[]
     */
    public function findAll($sys = false) {
        $this->logger->info(sprintf('%s() ', __METHOD__));

        $initial_id = ($sys) ? 0 : 1;
        $rows = $this->db->findAll($this->table, $initial_id);

        if (count($rows) == 0) {
            return array();
        }

        $list = array();
        foreach ($rows as $row) {
            $item = new static();
            $item->data = $row;

            $list[] = $item;
        }

        $this->logger->info(sprintf('%s(): %d', __METHOD__, count($list)));

        return $list;
    }

    /**
     * <b>Vereinfachte FindByField Methode</b>
     *
     * @param $field
     * @param $value
     * @return Model
     */
    public function findByField($field, $value) {
        $this->logger->info(sprintf('%s(%s, %s) ', __METHOD__, $field, $value));

        $this->data = $this->db->findByField($this->table, $field, $value);

        // Keine Daten, keine Instanz
        if ($this->data == null) {
            return null;
        }

        return $this;
    }

    /**
     * <b>Vereinfachte FindAllByField Methode</b>
     *
     * Erzeugt on the fly ein array mit dem Supertyp der Klasseninstanz
     * @param $field
     * @param $value
     * @return Model[]
     */
    public function findAllByField($field, $value) {
        $this->logger->info(sprintf('%s(%s, %s) ', __METHOD__, $field, $value));

        $rows = $this->db->findAllByField($this->table, $field, $value);

        if ($rows == null) {
            return null;
        }

        $list = array();
        foreach ($rows as $row) {
            $item = new static();
            $item->data = $row;

            $list[] = $item;
        }

        return $list;
    }

    /**
     * <b>Vereinfachte persist Methode</b>
     *
     * Der Logger loggt nur die Nutzdaten, deswegen sieht das im Log identisch aus.
     *
     * Es handelt sich allerdings einmal um ein Objekt und einmal nur um ein Array.
     *
     * @return bool
     */
    public function persist() {
        $this->logger->info(sprintf('%s(%s)', __METHOD__, print_r($this->getData(), true)));

        return $this->db->persist($this->table, $this->getData());
    }

    public function getData() {
        return $this->data;
    }

    /**
     * <b>Vereinfachte store Methode</b>
     *
     * @return bool
     */
    public function store() {
        $this->logger->info(sprintf('%s(%d, %s)', __METHOD__, $this->getId(), print_r($this->getData(), true)));

        if ($this->getId() > 1) {
            return $this->db->store($this->table, $this->getId(), $this->getData());
        }

        return false;
    }

    /**
     * <b>Vereinfachte delete Methode</b>
     *
     * @return bool
     */
    public function delete() {
        $this->logger->info(sprintf('%s(%d) ', __METHOD__, $this->getId()));

        if ($this->getId() > 1) {
            return $this->db->delete($this->table, $this->getId());
        }

        return false;
    }

}