1) DI, 2) Problém s komponentou a servisou

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Kcko
Člen | 470
+
0
-
  1. V jednom starším projektu mám cosi jako stromovou diskusi. Jsou to 2 třídy, jedna znázorňuje strom a druhá konkrétní uzel … vypadá to asi takto (zjednodušeně, ale princip je snad jasný). A oč mi jde, kdybych si chtěl udělat něco podobného v Nette, jak bych měl postupovat?

Třída Tree by byl model a třída Node taky model? (Obojí prezentuje skladbu dat). V Nette se vše řídí přes DI a vlastně se tím říká, že se použije jen 1 instance. Takže jak bych měl do modelu Tree dostat třídu Node a udělat si tam kolik instancí chci? (Samozřejmě, by to mohlo být udělané tak jak to mám ted, ale to by byla skrytá závislost a to nechci). Jak se to tedy prosím řeší?

<?php
$tree = new Tree;
$tree->add((new Node(1, 0))->set("Afrojack", "Ahoj jak se mate?"));
$tree->add((new Node(2, 1))->set("Kcko", "Jo dobry proc nespis?"));
$tree->add((new Node(3, 2))->set("Afrojack", "Nechce se mi a co ty?"));
$tree->add((new Node(4, 0))->set("Liána", "Poradí mi někdo s PHPkem?"));
?>
  1. Mám v neonu Presenter jako Servisu (kvůli automatickému předávání parametrů)

viz - App\ServiceModule\Presenters\DownloadPresenter("%wwwDir%/../downloads/") a udělal jsem si na zkoušku velmi jednoduchou komponentu (nic nedělá, šablona je prázdná), jen jsem to zkoušel přes factory, a Nette (2.1.4) mi vyhazuje tuhle chybu https://goo.gl/TDukxh a rve mi tu servisu jako argument komponenty menu (tak se ta easy komponenta jmenuje), proč? Pokud servisu zakomentuju, vše je OK. To je nějaký bug starší verze Nette nebo co to je? Zde na fóru se na to někdo už asi před 3 lety ptal, ale řešení nepadlo.

Díky.

CZechBoY
Člen | 3608
+
0
-
  1. Mně se to zdá jako obyčejný třídy, který jen uchovávaj data – nepotřebujou žádnou další službu ke svojí práci, vše dostanou v konstruktoru (nebo je tak ještě přepíšeš :-)).
  2. mně to normálně funguje

Asi budeš mít chybu někde jinde. Pošli jak vytváříš tu komponentu menu.

class HomepagePresenter extends Presenter
{
    public function __construct($wwwDir)
    {
        parent::__construct();

        dump($wwwDir);
    }

    public function beforeRender()
    {
        $this->terminate();
    }
}
services:
	- App\Presenters\HomepagePresenter("%wwwDir%/../downloads/")

Editoval CZechBoY (13. 1. 2017 0:21)

Kcko
Člen | 470
+
0
-

add 2)

services
App\ServiceModule\Presenters\DownloadPresenter(„%wwwDir%/../downloads/“)
App\FrontModule\Components\IMenuControlFactory

Menu

<?php

namespace App\FrontModule\Components;

use Nette;


class Menu extends Nette\Application\UI\Control
{
    public function render()
    {

        $this->template->setFile(__DIR__ . '/menu.latte');
        $this->template->render();


    }


}

interface IMenuControlFactory
{
    /** @return Menu */
    function create();
}

?>

BasePresenter

<?php

   /** @var App\FrontModule\Components\IMenuControlFactory @inject */
    public $menu;


    /**
     * @return mixed
     */
    public function createComponentMenu()
    {
        return $this->menu->create();
    }

?>

Chybová hláška: https://goo.gl/i0IFUK

  1. Jsou to obyčejný třídy na uložení dat, mají mezi sebou jen tu závislost, že třída Tree si ukládá instance třídy Node (1 instance = 1 řádek)

Takže to jsou tedy 2 model a v třídě Tree si v nějaké metodě XYZ ukládám jednotlivé instance třídy Node, to je tedy podle mě skrýtá závislost ne? Nemá se to tam nějak předat?

CZechBoY
Člen | 3608
+
0
-
  1. Však to jsou jen hloupý přepravky, ne? Žádný služby v nich nevyuživáš…
  2. aha, bug.. jdu vyzkoušet co dělá ten problém.
David Matějka
Moderator | 6445
+
+1
-

@Kcko to je chyba ve starsim nette. staci prekryt konstruktor konstruktorem bez argumentu:

class Menu extends Control
{

	public function __construct()
	{
		parent::__construct();
	}
}

edit: jo a nevim, jestli jsou vubec v 2.1 podporovane presentery jako sluzby. nechces aktualizovat nette? to uz je fakt stara verze..

Kcko
Člen | 470
+
0
-

David Matějka napsal(a):

@Kcko to je chyba ve starsim nette. staci prekryt konstruktor konstruktorem bez argumentu:

class Menu extends Control
{

	public function __construct()
	{
		parent::__construct();
	}
}

edit: jo a nevim, jestli jsou vubec v 2.1 podporovane presentery jako sluzby. nechces aktualizovat nette? to uz je fakt stara verze..

Funguje, díky! :) Asi budu muset, pak nebudu řešit bugy.

PS. 1) je teda ok? I když to jsou „přepravky na data“ jak nazval @CZechBoY

Editoval Kcko (13. 1. 2017 11:18)

CZechBoY
Člen | 3608
+
0
-

Ok, tak jsem to debugoval pomalu :D
Mně šel presenter regnout jako služba, ale nesmíš v něm vytvářet menu přes factory.

Kcko
Člen | 470
+
0
-

CZechBoY napsal(a):

Ok, tak jsem to debugoval pomalu :D
Mně šel presenter regnout jako služba, ale nesmíš v něm vytvářet menu přes factory.

Ale já ho přeci nevytvářel v tom presenteru, ale v jiném :-). To je fuk, bug ve verzi.

Zajímá mě taky hlavně taky 1čka.