registrace komponenty v presenteru

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

Ahoj,

v aplikaci mám nyní hodně komponent a jejich registrace vypadá i takto:

// presenter
// ...
protected function createComponentName()
{
       return $this->context->createName();
}
// ...

ve větším množství komponent se mi toto hodně nelíbí:

  1. kód nedělá nic zajímavého
  2. add 1 – settery můžu mít v konfiguraci projektu (v NEONu myslím)
  3. sahám na context

Můžu zaregistrovat komponentu k presenteru přímo v konfiguraci?

Šaman
Člen | 2668
+
0
-

Používám takovouhle supertovárničku. Tato patří do BasePresenteru, s malou úpravou ($this->presenter->context..) přijde ještě do BaseControl, abys mohl používat komponenty v komponentách.

<?php
use Nette;

...

/**
 * Supertovárnička na komponenty
 * Pokud neexistuje volaná komponenta, zkusí se zavolat továrnička z configu
 *
 * @param  string $name třída komponenty
 * @return Nette\Application\UI\Control
 */
protected function createComponent($name)
{
	$controlName = ucfirst($name);
	if (method_exists($this, "createComponent" . $controlName))
	{
		return parent::createComponent($name);
	}
	else
	{
		$method = "create" . $controlName;
		return $this->context->$method();
	}
}
?>

V konfigu si includuji pomocný konfigurační soubor components.neon, ve kterém mám:

<script>
parameters:

services:

factories:
	registrationForm: Annivers\Controls\RegistrationForm
	lostPasswordForm: Annivers\Controls\LostPasswordForm

	loginForm: Annivers\Controls\LoginForm
	logoutControl: Annivers\Controls\LogoutControl

	editUserForm: Annivers\Controls\EditUserForm
	newUserForm: Annivers\Controls\NewUserForm
</script>

Volání contextu se minimalizuje, komponenty se dají nakonfigurovat v NEONu (včetně dalších nastavení, je-li třeba) a pokud je potřeba mít na nějakou komponentu speciální továrničku, tak stači tuto továrničku napsat a ona se použije.

Nevýhoda je, že presenter nedeklaruje které komponenty bude potřebovat. Nicméně seznam všech možných komponent je v tom konfigu..

Editoval Šaman (30. 4. 2013 11:56)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jen si dovolím podotknout, že tento způsob má své velké nevýhody:

  • může snadno vést k bezpečnostní díře, které si vývojář nevšimne
  • po delší době lze snadno ztratit přehled, jaké komponenty který presenter využívá
Šaman
Člen | 2668
+
0
-

@vojtech.dobes: Jakou bezpečnostni díru máš na mysli? Kdysi jsem publikoval továrničku, která se snažila vytvořit komponentu z jakékoliv dostupné třídy. Tam určité bezpečnostní riziko bylo, kromě jiných problémů.
S tímhle zatím nemám problém, každou továrničku na komponentu si musím zapsat do konfigu, takže je všechno pod kontrolou, žádná černá magie se podle mě nekoná..
Udržovat přehled o komponentách presenteru je potřeba jinak, ale zase to řeší buď stejný kód továrny v několika presenterech, nebo ještě horší variantu všechny továrny v BasePresenteru (pak jsme na tom stejně).

Editoval Šaman (30. 4. 2013 16:54)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jakou bezpečnostni díru máš na mysli?

Uživatel je schopen vytvořit libovolnou zaregistrovanou komponentu, i když by to v daném presenteru nemělo být možné. To může mít nečekané následky (záleží na konkrétním případu: například může existovat datagrid, který umožňuje smazat záznam, a kontrola oprávnění k takové akci bude na úrovni presenteru).

nebo ještě horší variantu všechny továrny v BasePresenteru (pak jsme na tom stejně).

To s tím nijak nesouvisí.

Šaman
Člen | 2668
+
0
-

Kontrola oprávnění podle mě patří do modelu a případně do komponenty, která se něco snaží.
Ale ok, hypoteticky takovéto nebezpečí hrozí, kdo by chtěl podobnou supertovárničku použít aspoň ví, na co si dát pozor.

enumag
Člen | 2118
+
0
-

@Šaman: Podle mne si autorizaci má řešit vrstva presenter, tedy v Nette presentery a komponenty. Do modelu bych to nestrkal.

grogy
Člen | 147
+
0
-

Šaman napsal(a):

Díky, ovšem toto mi příjde moc magické.