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 | 2666
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 | 2666
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\DibiExtension22
a 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 pridaniDibi
douse
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
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