Parametry a jejich přetypování v presenteru

Pavel Kravčík
Člen | 1179
+
0
-

Řešíte nějak následující? Tohle samozřejmě hodí chybu v tom, že parametr není int, ale string.

// Nějaká URL
project.local/form?categoryId=1

// Presenter má komponentu form
pf createComponentForm(): CustomForm
{
	return $this->factory->create()
		->setCategoryId($this->getParameter('categoryId'));
}

// Funkce v komponentě na nastavení stavu
pf setCategoryId(?int $categoryId): self
{}

Řešené to může být například následovně:

pf setCategoryId(?string $categoryId): self
{
	$this->categoryId = $categoryId ? intval($categoryId) : null;
}

Co by se mi líbilo třeba přes anotaci nebo podobně jako jsou persistentní parametry, nevím ani proč. :)

// Presenter

/** @property ?int $categoryId */
F.Vesely
Člen | 367
+
+8
-

Ja to tedy resim pres parametr v action metode, ktery si pak ulozim do privatni promenne.

joe
Člen | 313
+
0
-

A nejde to řešit třeba jenom takto?

public function actionDefault(int $categoryId) {
    /** @var CustomForm $customForm */
    $customForm = $this->getComponent('customForm');
    $customForm->setCategoryId($categoryId);
}

Kód

setCategoryId(?string $categoryId)

se mi nelíbí, protože metoda říká, nastav ID kategorie, ale přitom její parametr je string.

Petr Steinbauer
Člen | 26
+
0
-

Já to dělám takto:

  • v routě kvuli hezke url zminim
$router->addRoute('category/<categoryId>', 'Category:default');
  • v Presenteru nastavim privatni promenou
    /** @var int|null $categoryId */
    private $categoryId = null;
  • a pak ji v action nastavim
public function actionDefault(?int $categoryId)
    {
		$this->categoryId = $categoryId;
    }
  • kdyz ji pak potrebuju, mám ji pozadovaneho typu
public function createComponentForm(): CustomForm
{
	return $this->factory->create()->setCategoryId($this->categoryId);
}
joe
Člen | 313
+
0
-

Prijde mi, ze nastavovani komponenty kdekoli jinde nez pres action ji dela NE znovu pouzitelnou, protoze muze byt pouzita pri ruznych akcich s ruznym nastavenim (pokud nejde o single action presentery)

Petr Steinbauer
Člen | 26
+
0
-

joe napsal(a):

Prijde mi, ze nastavovani komponenty kdekoli jinde nez pres action ji dela NE znovu pouzitelnou, protoze muze byt pouzita pri ruznych akcich s ruznym nastavenim (pokud nejde o single action presentery)

Beru to tak, že tím že ji svážu přes this, tak ji oficiálně „schválím“.

V praxi jsem se s přesunem komponent někam jinam moc nesetkal – a když, tak to $this->XXX mě na to hned upozorní.


Mno, a pak jsou komponenty, co si to berou samy a do url si strkají parametry jako divé (na tebe koukám, ublabooGride :) ) Ty si pak ale typování řeší sami v sobě.

joe
Člen | 313
+
0
-

@PetrSteinbauer Tomu moc nerozumím, já to myslel asi trochu jinak, pokud má presenter více akcí a v každé z nich použiju stejnou komponentu, pak mám na výběr, jestli napsat továrnu (createComponent...) jenom jednu a pak v každé action... si ji přizpůsobit a nebo napsat továren více. To, co je vhodnější, nejspíš záleží na způsobu nastavení té komponenty. Pokud se nastavení například liší jen v nastavení zdroje pro zobrazení, pak asi není důvod psát dvě továrny … nebo? :-)