Jak správně načítat závislosti v presenteru
- andros
- Člen | 145
Ahoj, většina presenterů mi zhruba takhle :
use Nette\Application\UI\Form;
use App\Model\DeliveryManager;
use App\Model\CashManager;
use Nette\Forms\Controls\SubmitButton;
/**
* @property-read \stdClass $template
*/
class OrderPresenter extends BasePresenter
{
/**
* @var DeliveryManager
*/
private $deliveryManager;
/**
* @var CashManager
*/
private $cashManager;
public function __construct(DeliveryManager $deliveryManager, CashManager $cashManager)
{
parent::__construct();
$this->deliveryManager = $deliveryManager;
$this->cashManager = $cashManager;
}
...
Podle PhpStormu bych to měl ale dělat trošku líp a radí: ass has 3 or more parent classes, consider using appropriate design patterns.
Poradíte mi prosím, co dělám špatně a jak to udělat líp ? :) Díky za každou radu.
- Šaman
- Člen | 2666
Předpokládám, že se to dá někde v PhpStormu nastavit.
Na otázku injectování závislostí do presenteru bych ale odpověděl tak,
že do presenteru se dá injectovat pomocí anotace (ovšem do public
property).
Pokud důsledně rozlišuješ abstract
a final
presentery, pak do těch abstraktních se doporučuje použít anotaci (nebo
jinou mechaniku která nechá volný konstruktor) a do finálních by bylo
nejčistější použít onen konstruktor. Ale většinou se používají
anotace všude, protože jsme líní :) A v presenteru to typicky ničemu
nevadí.
Pozor, všude jinde (mimo presentery) není možnost používat anotace
defautlně zapnutá!
- andros
- Člen | 145
Tu inspekci jsem v PhpStormu hledal, bohužel marně, ale někde tam
určitě bude.
A jestli to dobře chápu, tak v případě injectování pomocí anotace by
to vypadalo takto. Ovšem správně u final presenteru by to mělo být pomocí
konstruktoru, ale injectování pomocí anotace není nic proti ničemu.
use Nette\Application\UI\Form;
use Nette\Forms\Controls\SubmitButton;
/**
* @property-read \stdClass $template
*/
final class OrderPresenter extends BasePresenter
{
/**
* @var App\Model\DeliveryManager @inject
*/
public $deliveryManager;
/**
* @var App\Model\CashManager @inject
*/
public $cashManager;
// v tomto případě konstruktor není třeba
...
- Šaman
- Člen | 2666
Jj. Tohle je přímé zapisováni do public proměnné, takže porušuje OOP
zapozdření. Konstruktor je nejčistější způsob předávání povinných
závislostí.
Ale právě kvůli poměrně hluboké hiearchii presenterů by mohl nastat problém.
Ten odkaz je hodně starý a popisuje trochu jiný způsob, ale v novějších
Nette právě přibyla ta možnost použít property injection. Princip
zůstává stejný.
- andros
- Člen | 145
@CZechBoY díky za radu jak inspekci vypnout, jednoduché jako
většina věcí v tomto IDE
@Šaman díky už mám konečně zase o něco jasněji v incjectování
závislostí. Mezitím jsem našel od @FilipProcházka video
které ty závislosti vysvětluje.
@newPOPE myslíš tím vyčlenit danou logiku do zvláštní třídy , tu zaregistrovat v neonu jako službu a v presenteru pak injecnout jen tuto jednu službu ? Nebo jsem to pochopil špatně ? Díky za vysvětlení.