Práca s Nette\SmartObject
- Danndy
- Člen | 35
Zdravím,
mám problém s používaním Nette\SmartObject. Mám nasledovnú triedu :
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Nette\Utils\Strings;
/**
* @ORM\Entity()
*/
class Video
{
use \Nette\SmartObject;
use \Kdyby\Doctrine\Entities\Attributes\Identifier;
/**
* @ORM\Column(type="string", nullable=false)
* @var string
*/
protected $title;
/**
* @ORM\Column(type="string", nullable=true)
* @var string
*/
protected $description;
/**
* @ORM\Column(type="string", nullable=false)
* @var string
*/
protected $slug;
...
Následne chcem iba jednoducho vytvoriť objekt tejto triedy a naplniť hodnoty pomocou funkcie nasledovne:
public function addVideo($values) {
$video = new \App\Entity\Video();
$video->setTitle($values->title);
$video->setDescription($values->description);
$video->setYtCode($values->ytCode);
$video->setYtEmbedCode($values->ytEmbedCode);
$video->setPublished($values->published);
$this->em->persist($video)->flush();
return true;
}
Padá mi to na riadku
$video->setDescription($values->description);
a hlási chybu
Call to undefined method
App\Entity\Video::setDescription().
Kde robím chybu, a prečo mi to pre atribút $title
funguje ale
pre daľšie adtribúty už nie? Resp. ako pracovať s takýmto objektom aby
som gettery a settery mohol volať priamo cez
$obj->attr1 = 'val'
?
Vopred ďakujem za odpovede.
- h4kuna
- Backer | 740
SmartObject funguje tak že ti nedefinuje setter metody, ale když je máš nadefinovaný tak k názvům metod můžeš přistupovat jako k vlastnostem objektu.
Pokud si do Video entity napíšeš setter setDescription tak můžeš následující.
$video->description = $values->description;
Ale to že ti chybí metoda setDescription je momentálně správně.
Editoval h4kuna (24. 1. 2017 14:48)
- matopeto
- Člen | 395
Danndy napsal(a):
Dik za odpoveď. A je nejaká dostupná možnost v nette 2.4 volať setter bez toho aby som ho definoval? Tiež stále nechápem, prečo mi to pre prvý atribút
$title
prešlo nakľko nemám definovaný žiadny setter ani pre tento atribút.
Preco by si chcel volat setter ked nie je definovany :) ked ho chces tak si ho definuj alebo volaj na priamo, ziadne taketo magie nechces :), i ked si myslis ze chces, tak nechces :)
- Marek Bartoš
- Nette Blogger | 1274
Pokud takovou magii přece jen chceš (vážně nechceš), tak se to dá řešit přes __get a __set, ale bez použití SmartObject
- Marek Šneberger
- Člen | 130
Můžeš použít traitu Kdyby\Doctrine\Entities\MagicAccessors
,
která tuhle magii definuje.
Ale nedoporučuju, raději si ty settery a gettery vygeneruj. V PHPStormu je to
na pár ťuknutí do klávesnice, ani to reálně psát nemusíš.