Ako na povinne parametre v metodach ako create, view, edit a delete

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

Mam route:

<?php
$router[] = new Route('<presenter>/<action>/<id>', array(
		'presenter' => 'Default',
		'action' => 'default',
		'id' => NULL,
	));
?>

A presenter napr. ArticlesPresenter, ktory mam metody default, create, view, edit, delete
pri default nepotrebujem id, lebo tam zobrazim len list clankov.

Ale napr. pri metode edit je id paramter povinny. ja to riesim v tychto metodach nasledovne:

<?php
public function actionEdit($id)
{
	if ($id === NULL) {
		$this->flashMessage('...');
		$this->redirect('default');
	}
}
?>

Co sa mi zda velmi neprakticke. Nemate nejaky lepsi postup, ako toto riesit?

Vdaka

nAS
Člen | 277
+
0
-

Tak si to rozdel na vic routeru:

<?php
$router[] = new Route('<presenter>/create', array(
		'presenter' => 'Default',
		'action' => 'create',
	));
$router[] = new Route('<presenter>/edit/<id [0-9]+>', array(
		'presenter' => 'Default',
		'action' => 'edit',
	));
?>
piler
Člen | 111
+
0
-

nAS napsal(a):

Tak si to rozdel na vic routeru:

<?php
$router[] = new Route('<presenter>/create', array(
		'presenter' => 'Default',
		'action' => 'create',
	));
$router[] = new Route('<presenter>/edit/<id [0-9]+>', array(
		'presenter' => 'Default',
		'action' => 'edit',
	));
?>

a ked ma napr. ArticlesPresenter 10 actions tak mam spravit 10 routes? ked bude mat aplikacia 20 presenterov * 10 actions = 200 routes…to asi nie je moc dobre riesenie…alebo som ta zle pochopil?

Panda
Člen | 569
+
0
-

Já osobně nějaké povinné parametry vůbec neřeším – v každé takové akci stejně musím provést kontrolu, jestli specifikovaná položka existuje. A hledání špatného ID a NULL skončí stejným výsledkem – položka neexistuje.

Rozdělení na více routerů je nepraktické a zbytečně zatěžující – vyhodnocování složitých regulárních výrazů, do kterých se routy překládají, stojí dost času.

Ondřej Mirtes
Člen | 1536
+
0
-

Pokud má být parametr v dané action nepovinný, napíšeš do hlavičky metody $id=NULL, jinak to, že je jeho nepovinnost nastavená v routeru, neřešíš.

Pokud podle toho ID hledáš něco v databázi (asi pokaždé) a nenajdeš to tam, měl bys vyhazovat BadRequestException, která zařídí, že se na produkčním serveru zobrazí ErrorPresenter se 404kou.

piler
Člen | 111
+
0
-

Ondřej Mirtes napsal(a):

Pokud má být parametr v dané action nepovinný, napíšeš do hlavičky metody $id=NULL, jinak to, že je jeho nepovinnost nastavená v routeru, neřešíš.

Pokud podle toho ID hledáš něco v databázi (asi pokaždé) a nenajdeš to tam, měl bys vyhazovat BadRequestException, která zařídí, že se na produkčním serveru zobrazí ErrorPresenter se 404kou.

Toto riesenie sa mi velmi paci :)