Iterace SmartObject při použití private variables
- Fires
- Člen | 97
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);
}
}
?>
- Ondřej Kubíček
- Člen | 494
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
- Fires
- Člen | 97
- 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.
- 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
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));
}
}