K čemu se má používat decorator?
- CZechBoY
- Člen | 3608
Zdravím,
nedávno jsem se dočetl o síle decoratoru a zajímalo by mě k čemu ho
používáte.
Napadlo mě ho použít k nastavování závislostí pro Base* třídy aniž
bych musel povolovat inject.
Důvod proč nechci použít inject je jednoduchý: musel bych pod každou
třídu psát injet:yes a někdy (klasika) na to mohu i zapomenout.
Je to správná volba? Jak nastavujete závislosti v nižších úrovních
dědění?
Díky za názory.
Editoval CZechBoY (10. 5. 2016 12:21)
- David Matějka
- Moderator | 6445
Ano, je to urceny pro Base tridy. Ja to pouzivam prevazne (nebo spise vyhradne) u BaseControl
- Jan Tvrdík
- Nette guru | 2595
CZechBoY napsal(a): musel bych pod každou třídu psát injet:yes a někdy (klasika) na to mohu i zapomenout.
Přes decorator můžeš povolit inject pro všechny potomky konkrétní třídy.
- David Matějka
- Moderator | 6445
Jo a souvisejici diskuze https://forum.nette.org/…omci-zabyvat, na zaklade ktere to vzniklo
- CZechBoY
- Člen | 3608
@JanTvrdík aha, no stejně se mi injectování moc nelíbí – public property, kterou někdo někde špatně použije je prostě zlo. Vim že existuje nějaká kdyby alternativa, která umožní i přes nižší viditelnost injekci, ale to už je moc magie…
@DavidMatějka tak to je supr. Myslíš že je ok mít třeba traitu
TCached
, která vše zařídí aby mi jela cache, a pak třeba
v nějakým modelu použiju use TCached
? Nebo to je už moc?
Díky za odpovědi
- David Matějka
- Moderator | 6445
s implementaci problem neni, ale viz ta diskuze:
S traity nevím, jednak by to chtělo řešit možné aliasy metod, ale hlavně si nejsem jistý, jestli to nepodporuje prasení…
(osobne by se mi to taky libilo)
- David Matějka
- Moderator | 6445
CZechBoY napsal(a):
edit: librette/setup umí traity, ale je použitelný pro nette 2.3?
koukam, ze ho furt pouzivam (prave kvuli traitam) a projekt jede na 2.3, takze jo :)
- pata.kusik111
- Člen | 78
Možná s křížkem po funuse, ale přidám ještě jednu konkrétní aplikaci.
Potřebovali jsme logovat chyby v Nette aplikaci do NewRelic. Nebylo nic jednoduššího, než vytvořit
<?php
use \Tracy\ILogger;
/**
* Class LoggerDecorator
*/
class LoggerDecorator implements ILogger
{
/** @var ILogger */
private $oldLogger;
public function __construct(ILogger $oldLogger)
{
$this->oldLogger = $oldLogger;
}
/**
* @param string|array|Exception
* @param string
* @return string logged error filename
*/
function log($value, $priority = self::INFO)
{
$exceptionFile = $this->oldLogger->log($value, $priority);
if (is_array($value)) $value = implode(' ', $value);
if($value instanceof \Exception) {
newrelic_notice_error($value->getMessage(), $value);
return $exceptionFile;
}
newrelic_notice_error($value);
return $exceptionFile;
}
}
a pak v boostrapu zavolat:
$oldLogger = \Tracy\Debugger::getLogger();
$newLogger = LoggerDecorator($oldLogger);
\Tracy\Debugger::setLogger($newLogger);
Kód úmyslně zjednodušen pro ukázku. Jinak celé rozšíření je na githubu
- David Matějka
- Moderator | 6445
@pata.kusik111 @CZechBoY decorator pattern != nette decorator extension :)
- pata.kusik111
- Člen | 78
Asi v tom případě zas nechápu ten decorator pattern já. Přidávám pomocí dekoratoru interní funkcionalitu pro Tracy Logger (v tomto případě ještě logování do New Relicu), a to bez toho, abych změnil vnější API objektu (implementování interface ILogger). Podle mě tohle je naprostá definice decorator pattern. Ale prosím, opravte mě, poučte mě, rád bych to pochopil správně, pokud to chápu špatně.
- David Matějka
- Moderator | 6445
@pata.kusik111 decorator chapes dobre. ale decorator extension z nette dela neco jineho a s decorator patternem nesouvisi.
- CZechBoY
- Člen | 3608
@DavidMatějka otaguješ pls tu stable verzi? :-)
@pata.kusik111 nicméně ten tvůj kod se mi hodí na https://forum.nette.org/…astni-logger
- pata.kusik111
- Člen | 78
@DavidMatějka oh, aha, tak to se omlouvám, nějak jsem vůbec nepochopil, o čem celá tato diskuze je.
- Tomáš Votruba
- Moderator | 1114
Pokud tu stále hledáš opověď, mrkni na vlákno Jak funguje Decorator Extension a kdy ho použít?