Práca s Nette\SmartObject

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Danndy
Člen | 35
+
0
-

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
+
0
-

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)

Danndy
Člen | 35
+
0
-

@h4kuna

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.

Editoval Danndy (24. 1. 2017 15:11)

h4kuna
Backer | 740
+
0
-

To je divný. Proč jsou ty vlastnosti protected? Protože je to někde děděný? Projdi si to debuggerem kam to leze.

Editoval h4kuna (24. 1. 2017 16:21)

matopeto
Člen | 395
+
+5
-

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 | 1146
+
0
-

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
+
+1
-

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íš.