Iterace SmartObject při použití private variables

Fires
Člen | 97
+
0
-

Zdravím , jak lze udělat iterátor nad nette smart object ? Mám objekt

<?php
/**
 * Description of PageEntity
 *
 * @author David "Fires" Stein <info@davidstein.cz at http://davidstein.cz>
 *
 * Variables
 * @property int $id id
 * @property string $ident ident
 * @property string $title Page title
 * @property string $header_image Header image
 * @property string $layout Page layout
 * @property string $content Page content
 * @property int $id_author Page author id
 * @property string $extraCss Page extra css
 * @property string $extraJs Page extra js
 *
 * External services
 * @property-read PageService $pageService Page service
 *
 * Shared variables
 * @property-read \Projectglobe\User\UserEntity $author UserEntity
 */
class PageEntity extends \Projectglobe\FireEntity\FireEntity{

    use \Nette\SmartObject;

    //required services
    private $pageService;

    //table collums
    private $id;
    private $ident;
    private $title;
    private $header_image;
    private $layout;
    private $content;
    private $id_author;
    private $extraCss;
    private $extraJs;

    //shared variables
    private $author;

    public function __construct($data = null, $pageService) {
        parent::__construct($data);
        $this->pageService = $pageService;
    }

    public function save(){
        $this->pageService->save($this);
    }
.
. Gettery Settery atd.
.

?>

v repozitory z něj chci vyfiltrovat proměnné které jsou nutné pro update v databázi. Bohužel nevím jak nad timto objektem iterovat když mám proměnné označené jako private, normálně jsem použival viz. níže, potřebuji vlastně jen seznam názvu proměnných

<?php
class FireEntity implements \IteratorAggregate {

    function __construct($data = null) {
        if (!empty($data)) {
            foreach ($data as $key => $value) {
                $this->$key = $value;
            }
        }
    }

    public function setData($data) {
        foreach ($data as $key => $value) {
            $this->$key = $value;
        }
    }

    public function getIterator() {
        return new \ArrayIterator($this);
    }

}
?>
CZechBoY
Člen | 3608
+
0
-

Nešlo by použít normálně konstruktor s 11 parametry?

Editoval CZechBoY (2. 2. 2018 9:30)

Fires
Člen | 97
+
0
-

CZechBoY napsal(a):

Nešlo by použít normálně konstruktor s 11 parametry?

V které třídě ? Určitě by použít šel, ale nemám rad konstruktory s mnoha parametry. Vytváří to zbytečně škaredý kód.

Ondřej Kubíček
Člen | 494
+
0
-

navíc jiná entita může mít jiný počet parametrů v konstruktoru

tak si ty property vytáhni z doc bloku pomocí reflexe

CZechBoY
Člen | 3608
+
+2
-

No myslel jsem vytvořit objekt klasicky a ne vytvářet objekt přes nějaký magicky strukturovaný pole.

ad hodně parametrů: njn tak použij kompozici když se ti to nelíbí…

Editoval CZechBoY (2. 2. 2018 23:57)

Fires
Člen | 97
+
0
-
  1. magicky strukturované pole – pole je vlastně to co mi Dibi vrátí z databáze (tzn. názvy sloupců), tím pádem při úpravě struktury db nemusím měnit konstruktor. Zároveň poměrně krásné je že v testech se hned odhalí nekonzistentní db protože se do objektu pokusí přiřadit proměnou která není definovaná v objektu a tím selže test.
  2. vyřešil jsem to přidáním 2 polí do entity jedno nese názvy sloupců potřebné k insertu do db, druhé názvy sloupců potřebných pro update. + přidáním příslušných metod ( getDataArrayForUpdate, getDataArrayForInsert) které podle polí vrátí čisté pole dat do DB.
suwer
Člen | 33
+
0
-

Pokud chces pouzit IteratorAggregate na entitu s private vars, tak muzes vyuzit get_object_vars()

class SomeEntity implements \IteratorAggregate
{
	private $id;
	private $name = 'Default name'; // jenom pro priklad

	public function getIterator()
    {
		/**
	 	 * SomeEntity {
		 * 		id => null,
		 *		name => string(12) 'Default name'
		 * }
	 	 */
        return new \ArrayIterator(get_object_vars($this));
    }
}