bobby: Triggermethode in PHP

Beitrag lesen

Moin,

OK... Ein Beispiel (gekürzt):

<?php
declare(strict_types=1);
namespace orm;
use DateTime;
use stdClass;

/**
 * Class Content
 * @package orm
 * @table content
 */
class Content extends Orm {
	/**
	 * ID
	 * @var integer
	 */
    private $id = 0;
    /**
     * Artikeltitel
     * @var string
     * @I18N
     */
    private $title = '';
    
    /**
     * Konstruktor
     * @param stdClass|null $content
     * @throws \ReflectionException
     */
    public function __construct( stdClass $content = null  ){
        parent::__construct( $content );
    }
    /**
     * ID Setter
     * @param int $id
     */
    public function setId( int $id ) :void {
    	$this->id = $id;
    }
    /**
     * Setter Titel
     * @param string $title
     */
    public function setTitle( string $title ) :void {
    	$this->title = $title;
    }
    /**
     * getter Id
     * @return int id
     */
    public function getId():int {
    	return (int) $this->id;
    }
    /**
     * Getter Title
     * @return string Title
     */
    public function getTitle():string {
    	return (string) $this->title;
    }
   }

das wäre eine einfache ORM-Entität. Das soll auch wirklich nicht mehr drin stehn. So dazu gibt es die Klasse ORM

<?php
declare( strict_types = 1);
namespace orm;
use inc\{
    BasicDb
};
use PDOStatement;


/**
 * ORM Class Main ORM Class
 */
class Orm extends BasicDb {
    /**
     * Pointer for internal list counting
     * @var int
     */
    private $point = -1;
    /**
     * Query->Builder Object
     * @var string
     */
    private $queryVars;
    /**
     * result array
     * @var array
     */
    private $list = array();    
    /**
     * Construktor
     * @param \stdClass|null $obj
     * @throws \ReflectionException
     */
    public function __construct( \stdClass $obj = null ) {
        // call parent constructor
        parent::__construct();
        // initialize queryVars- QueryBuilder object
        $this->queryVars = (object) array();
        // if get a stdClass Object (from addToListFunction)
        if($obj !== null ):
            // an dieser Stelle werden die Eigenschaften über eine reflection ausgelesen und das Object entsprechend erzeugt
        endif;
    }

    /**
     * Methode to set a table
     * @param string $table
     */
    protected function setTable(string $table) {
       // setzt tabelle (Code gerade unwichtig)
    }             
    /**
     * Methode to add criterias to query builder
     * @param string $typ wich criteria type
     * @param string|array|object|int|boolean $value Value
     * @param string|array|object|int|boolean $arrvalue optional Arrayvalue
     */
    public function addCriteria(string $typ, $value, $arrvalue = null) {
        if($arrvalue === null)
            $this->queryVars->$typ = $value;
        else
            $this->queryVars->$typ[$value] = $arrvalue;
    }    
    /**
     * Query start
     * @param bool $debug
     * @return array result array
     */
    protected function startQuery(bool $debug=false):array{
        if($debug!==false)
            return parent::createQuery($this->queryVars,false,true);
        return parent::createQuery($this->queryVars );
    }
    /**
     * get actually pointer from internal list
     * @return int
     */
    public function getPointer() : int {
        return $this->point;
    }
    /**
     * add 1 to pointer
     * set ponter to -1 if end of list
     * @return int
     */
    protected function setPointer():int{
        $this->point = $this->point+1;
        if($this->point >= sizeof($this->list)):
            $this->point=-1;
        endif;
        return $this->point;
    }
    /**
     * get result list
     * @return array
     */
    public function getList():array {
        return $this->list;
    }
     /**
     * add 1 object to list
     * @param $obj
     * @param \stdClass $data
     */
    protected function addToList( $obj, \stdClass $data = null ) : void {
        foreach($this->extFields AS $key => $value)
            $this->setExtData($obj, $key, $value, $data);
        $this->list[] = $obj;
    }
     /**
     * @param bool $noduplicate
     * @return int
     * @throws \ReflectionException
     */
    public function save( bool $noduplicate = false ) : int {
        // methode zum Speichern der DAten. Wird wieder gesteuert über die Flags in der Entität
    }
     /**
     * Methode to delete a Element
     * @return number[]|string[]|PDOStatement
     */
    protected function deleteElement(){
        // löschmethode
    }

     /**
     * Method to get all Entrys of an ORM-Class
     * this method will calling from getById() and getBy() too
     * @param int $anzahl
     * @return OrmDb ORM-Object with result List
     * @throws \ReflectionException
     */
    public static function getAll($anzahl = null) : OrmDb {
        // Name from the calling Class
        $objectname = static::class;

        // new orm object for result return
        $ormobj = new OrmDb();

        // set table name
        if(empty($ormobj->queryVars->table))
            $ormobj->setTable(self::getTable($objectname));

        // do request
        if( $anzahl !== null )
            $ormobj->addCriteria( 'cps', $anzahl );
        foreach( (array) $ormobj->startQuery() as $obj )
            $ormobj->addToList( new $objectname( $obj ),$obj );
        // return ORM object wirth result list
        return $ormobj;
    }
     /**
     * Method to get the next Entry of List
     * return next entry
     * @return mixed
     */
    public function getEntry() {
        return $this->list[ $this->setPointer() ];
    }
     /**
     * Method to get Table from PHPDoc or from static var (old system)
     * @param string $objectname
     * @return mixed
     * @throws \ReflectionException
     */
    public static function getTable( string $objectname ) {
        // new Reflection Class to read PHPDoc
        $r = new \ReflectionClass(static::class );
        // get Class Comment
        $doc = $r->getDocComment();

        // seperater the Tbale declaration
        preg_match('~@table ([^ \n\r]*)~',(string) $doc, $erg);
        
        return $erg[1];        
    }
}

Das erstmal die grobe Struktur.

Aufgerufen wie folgt:

$contentfactory = \orm\Content::getAll();
$content = $contentfactory->getEntry();
echo $content->getTitle();

Und genau am letzten Punkt soll eben abgefangen werden dass die EIgenschaft "Title" ein Flag @I18N hat und dann entsprechend übersetzt wird. Dazu habe ich jetzt den Getter für Titel auuf private gesetzt und eine __call()-methode eingefügt. Diese liefert auch die Übersetzung. ich möchte aber, wenn keine Übersetzung vorhanden ist, den originaltext aus $title anzeigen lassen. Da ich aber $titel und den getter auf private stehen habe, erlange ich keinen Zugriff darauf.

(Der Code ist übrigens stark gekürzt, aber ich denke das relevante ist dabei)

Gruß Bobby

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)