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