Připojení knihovny Dibi k databázi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Mahal
Člen | 20
+
0
-

Dobrý den,
snažím se připojit knihovnu Dibi k současnému projektu. Bohužel při snaze odeslání dotazu laděnka hlásí chybu „Dibi is not connected to database.“. Přitom v configu používám toto nastavení (připojení „database“ jako takové funguje).

database:
    dsn: 'mysql:host=127.0.0.1;dbname=runetrack'
    user: root
    password:

services:
    connection:
        class: Dibi\Connection(%database%)

Potřeboval bych poradit, jak správně knihovnu napojit. (soubory v dokumentaci neodpovídají současnému stavu) Děkuji

David Matějka
Moderator | 6445
+
0
-

V sekci database konfigurujes nette\database. A na ty hodnoty se nemuzes odkazovat pres %database%, takhle se muzes odkazovat pouze na parametry v sekci parameters, tedy treba:

parameters:
	database:
		foo: bar

Ale pro dibi je lepsi pouzit prilozeny bridge pro nette, ukazka konfigurace: https://github.com/….sample.neon

Mahal
Člen | 20
+
0
-

Děkuji za odpověď.
Po použití přiloženého birdge mě laděnka postupně donutila odmazat „Nette\Database\Context“ z constructů (vyplývá z původního configu?), ale bohužel připojení stále nefunguje.

Pozn.// Pokud si zavedu připojení např. přímo v modelu („\dibi::connection[(…)]“) tak je připojení OK.

Šaman
Člen | 2666
+
0
-

Statické vytvoření sice funguje, ale je to velmi nedobrý způsob.
Pokud používáš Dibi, tak samozřejmě nemáš mít nikde závislost na Nette\Database\Context. A bez řečení toho, CO ti nefunguje to těžko pomůžeme.

Mahal
Člen | 20
+
0
-

Pokud umístím databázi jako „parameters“ nebo zřídím config dle dokumentace Nette|Dokumentace
dostanu pouze chybovou hlášku „Found sections ‚common‘ in configuration, but corresponding extensions are missing.“

Mahal
Člen | 20
+
0
-

Šaman napsal(a):

Statické vytvoření sice funguje, ale je to velmi nedobrý způsob.
Pokud používáš Dibi, tak samozřejmě nemáš mít nikde závislost na Nette\Database\Context. A bez řečení toho, CO ti nefunguje to těžko pomůžeme.

Právě proto bych rád zřídil připojení již pomocí configu.

Jak jsem již řekl, nefunguje připojení Dibi k dB (nebo-li nejspíše vůbec neproběhne) „Dibi is not connected to database.“. Postup dle dokumentace je okomentován v předposledním příspěvku.

Edit>// Při zavádění dle dokumentace je hlášena chyba v Bootstrapu
„Class ‚DibiNetteExtension‘ not found“

Současný kód vypadá takto, s tím, že __construct() nechávám bez argumentu. Musí se v tomto případě přístup předávat jako u původní dB? Popř. jak?

config

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

dibi:
	host: localhost
	username: root
	password:
	database: runetrack
	lazy: TRUE

Editoval Mahal (3. 4. 2016 17:54)

Šaman
Člen | 2666
+
0
-

Tím CO byla myšlena chybová hláška, případně co máš v configu a tak. Nějaký bližsí popis.

V tomto případě ti to píše, že to nemůže najít DibiNetteExtension. Což je divné, protože ty bys měl chtít načíst DibiNette20Extension, DibiNette21Extension, nebo v nových Nette DibiExtension21 či DibiExtension22.
Záleží na verzi Nette a Dibi. Obojí zjisti a taky pošli co máš v configu (jestli se ti něco netluče v config.neon vs config.local.neon).

Editoval Šaman (3. 4. 2016 18:00)

Mahal
Člen | 20
+
0
-

Nette 2.3.9, Dibi v3 (nejnovější, oboje)

Mějme příklad

  • čistý projekt
  • dibi staženo pomocí composeru

config.local.neon

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

dibi:
	host: localhost
	username: root
	password:
	database: runetrack
	lazy: TRUE

config.neon

parameters:
    database:
        driver: mysql
        host: localhost
        dbname: runetrack
        user: root
        password:
        substitutions:
            db: runetrack


php:
	date.timezone: Europe/Prague


application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter


session:
	expiration: 14 days


services:
	- App\Model\UserManager
	- App\Forms\SignFormFactory
	router: App\RouterFactory::createRouter

bootstrap.php (nyní bez extensiony – pokud zavedu dle dokumentace – not found)

<?php

require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;

$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$container = $configurator->createContainer();


return $container;

V případě zavedení do presenteru hlasí „not found“ také

/** @var DibiConnection @inject */
public $db;

Editoval Mahal (3. 4. 2016 18:05)

David Matějka
Moderator | 6445
+
+1
-

jake „not found“ to hazi? tamto

„Class ‚DibiNetteExtension‘ not found“

?
asi si tam nechal ten kod, co je uveden zde, tenhle clanek muzes ignorovat, uz je zastaraly

Šaman
Člen | 2666
+
+1
-

Aha. Ta dokumentace(je to článek, nikoliv oficielní dokumentace) není úplně aktuální, extension se dá přidávat sice i v bootstrapu, ale lepší je přidat ji v configu, což ty děláš. Na bootstrap tedy sahat nemusíš. Pokud bys to ale dělal, musíš chtít Dibi\Bridges\Nette\DibiExtension22 a nikoliv DibiNetteExtension.

Ale chyba je jinde. V presenteru chceš přece

<?php
use Dibi;

# …

/** @var Dibi\Connection @inject */
public $db;
?>

protože používáš aktuální Dibi které používá namespaces.

Editoval Šaman (3. 4. 2016 18:29)

Mahal
Člen | 20
+
0
-

Šaman napsal(a):

Aha. Ta dokumentace není úplně aktuální, extension se dá přidávat sice i v bootstrapu, ale lepší je přidat ji v configu, což ty děláš. Na bootstrap tedy sahat nemusíš. Pokud bys to ale dělal, musíš chtít Dibi\Bridges\Nette\DibiExtension22 a nikoliv DibiNetteExtension.

Ale chyba ji jinde. V presenteru chceš přece

<?php
/** @var Dibi\Connection @inject */
public $db;
?>

protože používáš aktuální Dibi které pouzívá namespaces.

Děkuji, toho jsem si nevšiml.
Dobře, danou dokumentaci vynechám. Bohužel i tak (pres Dibi\Connection) „Class or interface ‚App\Presenters\Dibi\Connection‘ used in @var annotation at App\Presenters\HomePresenter::$db not found. Check annotation and ‚use‘ statements.“

David Matějka
Moderator | 6445
+
+2
-

precti si, jak funguji namespace: http://php.net/…s.basics.php

v tomhle pripade to vyresi bud pouziti FQN \Dibi\Connection (pridane \ na zacatku) nebo pridani Dibi do use

Mahal
Člen | 20
+
0
-

David Matějka napsal(a):

precti si, jak funguji namespace: http://php.net/…s.basics.php

v tomhle pripade to vyresi bud pouziti FQN \Dibi\Connection (pridane \ na zacatku) nebo pridani Dibi do use

Ano, děkuji, (\Dibi\Connection) je ok, ale bohužel jsem ještě někde musel něco vynechat.

Chápu správně, že po @var notaci by mělo být spojení předáno samo? V současné chvíli mám vše stejně (viz. kódy nahoře), s pozměněnou anotací. Nyní je ale obsah $db NULL.

Případně, jak se správně v tomto případě předává připojení (popř. i do modelu, je v tomto dokumentace aktuální?)

Děkuji

Šaman
Člen | 2666
+
0
-

Doplnil jsem to do ukázky, aby se nenachytal i někdo další…

Šaman
Člen | 2666
+
0
-

Mahal napsal(a):
Případně, jak se správně v tomto případě předává připojení (popř. i do modelu, je v tomto dokumentace aktuální?)

NULL je to v preseteru, nebo v modelu?
Dokumantace k předávání závislostí je tady a anotace funguje JEN v presenterech. Jinde použij konstruktor.
Pěkný tahák je tu.

Editoval Šaman (3. 4. 2016 18:38)

Mahal
Člen | 20
+
0
-

Šaman napsal(a):

Mahal napsal(a):
Případně, jak se správně v tomto případě předává připojení (popř. i do modelu, je v tomto dokumentace aktuální?)

NULL je to v preseteru, nebo v modelu?
Dokumantace k předávání závislostí je tady a anotace funguje JEN v presenterech. Jinde použij konstruktor.
Pěkný tahák je tu.

Děkuji, odkazy ještě pořádně nastuduji, ale z prvního pohledu to funguje tak, jak jsem si myslel.

db zkouším uvádět a dumpovat v presenteru (tudíž mám zavedeno v anotaci, viz. výše, nikoliv v constructu) – načež dostávám NULL

class HomePresenter extends BasePresenter
{
    private $user_name;
    public $model;
    public $page_object;

    /** @var \Dibi\Connection @inject */
    public $db;

	public function __construct()
    {
        dump($this->db);exit;

	...
David Matějka
Moderator | 6445
+
+2
-

Ano, v konstruktoru to bude NULL, se zavislostmi pracuj nejdrive ve startup metode

Mahal
Člen | 20
+
0
-

Ano, přesně tím to bylo. :)

Děkuji všem za pomoc, již plně funkční.