Jak správně načítat závislosti v presenteru

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

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.

CZechBoY
Člen | 3608
+
0
-

S tim nic neuděláš, už jen Nettí UI\Presenter má víc jak 3 předky. Tahle inspekce je zrovna u Nette dost na ***.

Šaman
Člen | 2666
+
0
-

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
+
0
-

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
+
0
-

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

CZechBoY
Člen | 3608
+
0
-

V phpstorm na té chybě dej alt+enter, prvni položka, edit settings.

newPOPE
Člen | 648
+
+1
-

Akonahle ti pocet zavislosti v Presenteri (kdekolvek inde) vyrastie je dobre danu logiku dat do sluzby a v presenteri (na danom mieste) vyzadovat len tuto sluzbu.

andros
Člen | 145
+
0
-

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

newPOPE
Člen | 648
+
0
-

@andros ano tak