Připojení knihovny Dibi k databázi

- Mahal
- Člen | 20
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
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
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.

- Mahal
- Člen | 20
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
Š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 naNette\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 | 2668
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
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
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 | 2668
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
Š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\DibiExtension22a nikolivDibiNetteExtension.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
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
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 pridaniDibidouse
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 | 2668
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
Š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
Ano, v konstruktoru to bude NULL, se zavislostmi pracuj nejdrive ve startup metode