nette 3.1 + dibi 4.2 – správné napojeni dibi do nette

- papirek
- Člen | 8
Ahoj, mam úplně čisté rozběhnuté nette 3.1 a snažím se už 2 dny do něj správně „napojit“ dibi 4.2… žádný z návodů co sem našel mi nefunguje. Zkoušel jsem už snad vše i metodou pokus omyl a pořád mi tracy píše chyby…
je někde nějaký návod, krok za krokem, který je aktuální a bude fungovat?
Aktuálně mám takovýto stav
vytvořil jsem soubor dibi.neon s tímto obsahem
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
parameters:
database:
host: localhost
username: root
password: ***
database: foo
lazy: true
services:
connection:
class: DibiConnection(%database%)
pak sem do bootstrap.php pridal
$configurator->addConfig($appDir . '/config/dibi.neon');
no a pak jsem si vytvoril tridu app/Model/Hook.php
<?php
namespace App\Model;
use Dibi;
class Hook {
private $database;
public function __construct(Dibi\Connection $database)
{
$this->database = $database;
}
public function test() {
$sql = dibi::fetchAll('select * from [clients]');
dump($sql);
}
}
za tohoto stavu mi Tracy vraci chybu: Service ‚connection‘: option ‚class‘ should be changed to ‚factory‘
kdyz v dibi.neon prepisu class na factory chyba se zmeni na: Service ‚connection‘: Class DibiConnection not found
zkousel sem ruzne kombinace ruznych navodu a uz nevim kam dal a nechci to vzdat a pripojovat se na „hulváta“ v bootstrap.php pomocí dibi::conection(); :-)
moc dekuji za pomoc

- chemix
- Nette Core | 1310
@papirek a jen dotaz proc si injectujes dibi do tridy kdyz se pak snazis ji volat magicky ? nemelo by zde namisto
public function test() {
$sql = dibi::fetchAll('select * from [clients]');
dump($sql);
}
byt
public function test() {
$sql = $this->database->fetchAll('select * from [clients]');
dump($sql);
}

- papirek
- Člen | 8
David Grudl napsal(a):
A tohle nefunguje? https://dibi.nette.org/…ocumentation#…
No to jsem zkoušel jako první a když pak zkouším v HookPresenter toto píše to tuto chybu
$hook = new Hook();
dump($hook->test());
Too few arguments to function App\Model\Hook::__construct(), 0 passed in /var/www/telegram.papirek.cz/app/Presenters/HookPresenter.php on line 30 and exactly 1 expected
pro jistotu
mam v dibi.neon obsah z dokumentace co ste poslal a v modelu toto
namespace App\Model;
use Dibi;
class Hook {
private $database;
public function __construct(Dibi\Connection $database)
{
$this->database = $database;
}
public function test() {
$sql = $this->database->fetchAll('select * from [clients]');
dump($sql);
}
}

- papirek
- Člen | 8
chemix napsal(a):
@papirek a jen dotaz proc si injectujes dibi do tridy kdyz se pak snazis ji volat magicky ? nemelo by zde namisto
public function test() { $sql = dibi::fetchAll('select * from [clients]'); dump($sql); }byt
public function test() { $sql = $this->database->fetchAll('select * from [clients]'); dump($sql); }
pravda, dekuji – zacatecnik se nezapre :-)

- Marek Bartoš
- Nette Blogger | 1313
papirek napsal(a):
David Grudl napsal(a):
A tohle nefunguje? https://dibi.nette.org/…ocumentation#…
No to jsem zkoušel jako první a když pak zkouším v HookPresenter toto píše to tuto chybu
$hook = new Hook(); dump($hook->test());Too few arguments to function App\Model\Hook::__construct(), 0 passed in /var/www/telegram.papirek.cz/app/Presenters/HookPresenter.php on line 30 and exactly 1 expected
pro jistotu
mam v dibi.neon obsah z dokumentace co ste poslal a v modelu toto
namespace App\Model; use Dibi; class Hook { private $database; public function __construct(Dibi\Connection $database) { $this->database = $database; } public function test() { $sql = $this->database->fetchAll('select * from [clients]'); dump($sql); } }
Hook v konstruktoru vyžaduje Connection jako
závislost. Musíš mu závislost předat, když ho vytváříš přes
new. DI ti předává služby pouze do služeb, které samo
vytváří, nemá jak ti je předat když objekt vytváříš
přes new

- papirek
- Člen | 8
Marek Bartoš napsal(a):
papirek napsal(a):
David Grudl napsal(a):
A tohle nefunguje? https://dibi.nette.org/…ocumentation#…
No to jsem zkoušel jako první a když pak zkouším v HookPresenter toto píše to tuto chybu
$hook = new Hook(); dump($hook->test());Too few arguments to function App\Model\Hook::__construct(), 0 passed in /var/www/telegram.papirek.cz/app/Presenters/HookPresenter.php on line 30 and exactly 1 expected
pro jistotu
mam v dibi.neon obsah z dokumentace co ste poslal a v modelu toto
namespace App\Model; use Dibi; class Hook { private $database; public function __construct(Dibi\Connection $database) { $this->database = $database; } public function test() { $sql = $this->database->fetchAll('select * from [clients]'); dump($sql); } }
Hookv konstruktoru vyžadujeConnectionjako závislost. Musíš mu závislost předat, když ho vytváříš přesnew. DI ti předává služby pouze do služeb, které samo vytváří, nemá jak ti je předat když objekt vytváříš přesnew
a jak mam tedy ten model Hook, ktery tedy asi dibi pouziva a je pripojeny k DB spravne, v presenteru HookPresenter pouzivat? moc tomu nerozumim podle vaseho komentare… dekuju za trpelivost…

- dakur
- Člen | 493
Jinými slovy – cokoliv, co využívá dependency injection
(Hook vyžaduje Dibi\Connection), musí být samo
v dependency injection containeru registrováno (App\Model\Hook v
config.neon), aby mu ten container mohl ty závislosti předat.
Alternativní způsob je udělat si to všechno sám:
$this->hook = new Hook(new Dibi\Connection());
Ale to jde přesně proti myšlence dependency injection, protože DI je o tom, že řeší závislosti za nás a my se můžeme soustředit na samotnou logiku aplikace.
Editoval dakur (18. 5. 2021 15:38)