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://dibiphp.com/…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 | 1280
papirek napsal(a):
David Grudl napsal(a):
A tohle nefunguje? https://dibiphp.com/…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://dibiphp.com/…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žadujeConnection
jako 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)