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

papirek
Člen | 8
+
0
-

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

David Grudl
Nette Core | 8239
+
+1
-
chemix
Nette Core | 1310
+
+1
-

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

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

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

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

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ž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

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…

stepos2
Člen | 53
+
+1
-

config.neon:

services:
	- App\Model\Hook

HookPresenter:

use App\Model\Hook;
use Nette\Application\UI\Presenter;

class HookPresenter extends Presenter
{
	private Hook $hook;

	public function __construct(Hook $hook)
	{
		$this->hook = $hook;
	}
}

Editoval stepos2 (18. 5. 2021 14:11)

dakur
Člen | 493
+
0
-

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)