registrace komponenty v presenteru

- grogy
 - Člen | 147
 
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í:
- kód nedělá nic zajímavého
 - add 1 – settery můžu mít v konfiguraci projektu (v NEONu myslím)
 - sahám na context
 
Můžu zaregistrovat komponentu k presenteru přímo v konfiguraci?

- Šaman
 - Člen | 2668
 
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
 
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
 
@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
 
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í.