1) DI, 2) Problém s komponentou a servisou
- Kcko
- Člen | 470
- 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?"));
?>
- 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
- 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š :-)).
- 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
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
- 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?
- David Matějka
- Moderator | 6445
@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
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)