Jako kdybych nic nepsal – Dibi připojení
- Legáček
- Člen | 16
Zdravím páni programátoři,
jsem teprve začátečník, ale za tohle se opravdu stydím – nechápu proč
se nedokážu připojit k databázi pomocí dibi. Laděnka píše: „Access
denied for user ''@'localhost' (using password: NO)“.
Přitom v config.neon mám
common:
php: # PHP configuration
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
# default_charset: "UTF-8"
service:
Nette\Security\IAuthenticator: UsersModel
Nette\Loaders\RobotLoader:
option:
directory: [%appDir%, %libsDir%]
run: true
production < common:
database:
driver: mysqli
host: localhost //zkoušel jsem i server:
database: test
username: root
password: heslo
development < common:
console < common:
No a v bootstrap.php mám
// Load configuration from config.neon file
Environment::loadConfig();
// Připojíme se k databázi
dibi::connect(array(Environment::getConfig('database')));
Zkoušel jsem už strašně moc věcí a jednou jsem se i připojil, ale né přes neon ale ručně v bootstrapu.php jsem si udělal proměnou s polem, ale teď to taky nejde. Prý to musí být Integer bo String :)) Co dělám špatně, že mi píše laděnka totok i když to mám v neonu určený :(
- drakul
- Člen | 37
Mám jen pár poznatků a nevím jestli to pomůže:
- v tom configu nemáš tabelátorama vytvořenou hierarchii těch položek (jako to máš v tom configu v horní části). Takže zkus tu „database:“ odstrčit jedním tabelátorem, to pod ním (driver, host, …) dvěma.
- zkus dibi::connect(array()Environment::getConfig(‚database‘));
- Legáček
- Člen | 16
To drakul: Zkoušel jsem jak první tak druhou možnost.
1.Možnost laděnka vypsala, že špatný znaky nebo něco navíc 2. Možnost
mi to vypsalo chybu, že to musí být string bo integer.
To VakVas: Asi takhle to vypadalo, když jsem to zkoušel.
common:
php: # PHP configuration
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
# default_charset: "UTF-8"
service:
Nette\Security\IAuthenticator: UsersModel
Nette\Loaders\RobotLoader:
option:
directory: [%appDir%, %libsDir%]
run: true
database: // Jeden tab a pro driver,host.. 2x tab taky nešlo...
driver = "mysqli"
host = "localhost"
database = "test"
username = "root"
password = "heslo"
production < common:
development < common:
console < common:
- 22
- Člen | 1478
- kde jsi přišel na tohle?
dibi::connect(array(Environment::getConfig('database')));
//správně
dibi::connect(Environment::getConfig('database'));
- ukaž dump
Debugger::dump(Environment::getConfig('database'));
exit;
používáš správnou verzi Dibi knihovny? Dibi 1.5rc?
Editoval 22 (5. 5. 2011 10:44)
- 22
- Člen | 1478
máš něco špatně v configu, nevidím důvod, proč by to nemělo
fungovat. Takže vydumpuj ještě Environment::loadConfig()
Jaká je to verze Nette? Předpokládám, že taky nějaký release z tohoto
týdne aspoň…
Edit: doufám, že ty rovnítka jsi odstranil v configu databáze.. a nahradil dvojtečkou + uvozovky pryč
Editoval 22 (5. 5. 2011 12:20)
- Legáček
- Člen | 16
To 22: Stáhl jsem verzi „Nette Framework 2.0-alpha2 pro PHP 5.3 se jmennými prostory“ a k tomu ten nejnovější Dibi 1.5Rc. Takhle vypadá dump Environment::loadConfig().
Nette\Config\Config(3) {
"php" => Nette\Config\Config(1) {
"date.timezone" => "Europe/Prague" (13)
}
"service" => Nette\Config\Config(2) {
"Nette\Security\IAuthenticator" => "UsersModel" (10)
"Nette\Loaders\RobotLoader" => Nette\Config\Config(3) {
"option" => Nette\Config\Config(1) { ... }
"run" => TRUE
"factory" => NULL
}
}
"const" => NULL
}
Říkám jak kdybych do toho configu nic nenapsal. A config vypadá takhle.
common:
php: # PHP configuration
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
# default_charset: "UTF-8"
service:
Nette\Security\IAuthenticator: UsersModel
Nette\Loaders\RobotLoader:
option:
directory: [%appDir%, %libsDir%]
run: true
database: # Když to zarovnám jako service nebo php, tak to vyhodí chybu že tam mám tab a nějaký špatný písmenka nebo co...
host: localhost
username: root
password: heslo
database: test
profiler: true
lazy: true
run: true
result:
detectTypes: true
production < common:
development < common:
console < common:
Já to taky nechápu proč mám pořád nějaký problémy s Nette – Minulý týden jsem se pral vůbec abych zapnul Cool Url v Nette :(( Nechápu proč by to taky nemělo jít :-x
- 22
- Člen | 1478
common:
php: # PHP configuration
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
zlib.output_compression: yes
default_charset: "UTF-8"
service:
Nette\Security\IAuthenticator: UsersModel
Nette\Loaders\RobotLoader:
option:
directory: [%appDir%, %libsDir%]
run: true
database:
host: localhost
username: root
password: heslo
database: test
profiler: true
lazy: true
run: true
result:
detectTypes: true
musí to být takto, odsazeno stejnými tabulátory, jako předchozí sekce, které jak vidíš, se v pohodě do pole naparsují, už nevím, jak to vysvětlit asi.
Editoval 22 (5. 5. 2011 16:17)
- Legáček
- Člen | 16
To 22: Přesně tohle navrhoval drakul, abych to srovnal, ale nefungovalo mi to psalo to něco s těma řádkami. A prostě nechápu jak, ale přísahám bohu, že jsem to měl naprosto stejné jak si vložil teď ty. ALE ÚPLNĚ. A nešlo mi to. Tak jsem to zkusil ctr+c a ctr+v a nic se nezměnilo jen se odkomentovali zlib.output a default_charset a funguje to. Věc je vyřešena, ale fakt netuším co jsem tam měl za chybu – nějakou neviditelnou :-// Děkuji moc …
- drakul
- Člen | 37
taky jsem hledal zapomenuté mezery a problém byl v nich. Doporučuju Ti označit si to „prázdné místo před "date.timezone: Europe/Prague“ (tzn. ty mezery / tabulátory) a pak jimi pomocí CTRL+C → CTRL+V nahradit „volné místo“ před konfigurací položek do [database]. Snad jsem to napsal pochopitelně :)
- bubuss
- Člen | 5
Je to skoro mesic co jsem tu zadal o prava na upravu dokumentace a porad se nic nedeje :( Zacinam mit pocit, ze nette na to jak se chlubi vykonem a rychlosti, tak v komunikaci tezce pokulhava a pro ty, kdoz s tim chteji zacit je to dost slozite. Myslim, ze spousta potencialnich zajemcu to vzda a radsi se poohlidne po jinem frameworku. Je to skoda, protoze jsem Nette docela fandil:(
- Martin
- Člen | 171
bubuss: nespletl sis vlákno? Malinko OT. Ale jen na okraj – jsem tu 3× déle než Ty, leccos bych taky v dokumentaci měnil a třeba i už věděl, jak. Přesto by mě ani nenapadlo žádat o práva na úpravu. Proč? Protože plno věcí se ještě mění pod rukama, horko těžko zprovozním něco s novou verzí podle starého tutoriálu, ale za týden už nějaká drobnost funguje jinak. Když proberu své posty za ty 3 měsíce, tak ve třetině z nich jsem byl úplně mimo, přitom šlo třeba jen o to, že jsem přehlédl nějakou drobnost v aktuálně nejnovějších examples, neměl jsem včerejší commit či prostě jen něco v Nette málo dlouho dělal a neznal „best practices“. Tím nepíšu, že je dobře, že David do vlákna o dokumentaci už dlouho nepsal. Ale být jím, u každého žadatele stejně nejprve projdu zpětně pár jeho postů kvůli zjištění jeho schopnosti se věcně, správně vyjádřit, než bych práva přidělil. Ty tu nemáš nic :-)
- Patrik Votoček
- Člen | 2221
<OT>
Martin napsal(a):
Tím nepíšu, že je dobře, že David do vlákna o dokumentaci už dlouho nepsal. Ale být jím, u každého žadatele stejně nejprve projdu zpětně pár jeho postů kvůli zjištění jeho schopnosti se věcně, správně vyjádřit, než bych práva přidělil.
Ono to je buřt. Stejně skoro nikdo z těch kdo si o to právo
zažádali a dostali ho nic nikde nezměnil.
</OT>
- jazby
- Člen | 44
Zdravím, snažím se spojit s databází v nové verzi nette: Nette Framework 2.0-dev (revision 11c9568 released on 2011–05–18) a končím chybou InvalidArgumentException – Configuration must be array, string or object.
Nevím už co dělám špatně:
config.neon
common:
php: # PHP configuration
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
# default_charset: "UTF-8"
services:
authenticator: AuthModel
robotLoader:
option:
directory: [%appDir%, %libsDir%]
run: true
database:
driver: mysql
database: file_server
charset: utf8
lazy: TRUE
host: 127.0.0.1
username: root
password:
production < common:
development < common:
console < common:
Bootstrap.php
Debugger::$strictMode = TRUE;
Debugger::enable();
// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$configurator->loadConfig(__DIR__ . '/config.neon');
// Configure application
$application = $configurator->container->application;
$application->onStartup[] = 'BaseModel::initialize';
$application->errorPresenter = 'Error';
BaseModel.php
public static function initialize()
{
\Nette\Diagnostics\Debugger::dump(Environment::getConfig( 'database' ));
self::$connection = new DibiConnection( Environment::getConfig( 'database' ) );
}
Debbugger vypíše NULL a laděnka poté samozřejmě informuje. že NULL
není pole…
V předchozí verzi (Nette-2.0 alpha) mi to fungovalo korektně. Díky
za pomoc
- studna
- Člen | 181
V bootstrapu config nahráváš do $configurator. V modelu ho pak chceš po Environmentu. Takže do bootstrapu přidej
Environment::loadConfig( __DIR__ . '/config.neon' )
a nebo třeba nějak takto
$cont = Environment::getContext();
$cont->addService('database', function() use ($container){
return new NejakePripojeni( $container->params );
});
- jazby
- Člen | 44
moc díky za rychlou odpověď. Stačil Environment::loadconfig.
Já si říkal že to bude úplná blbost. Jen by mě možná teda potom
zajímalo, jak to „nečíst“ z Environmentu a zároveň se připojovat až
v basemodelu. Nechci to připojení mít v bootstrapu a také se mi teď
nelíbí ten dvojitý loadconfig hned pod sebou. Tj, jak to udělat správně a
dle filozofie Nette? Nějak se v té nové verzi Nette zatím neorientuji.
Editoval jazby (23. 5. 2011 17:01)
- bojovyletoun
- Člen | 667
S touto chybou se setkávám podruhé (zde) – ve zkratce to znamená toto:
$configurator=Nette\Environment::getConfigurator(); // použij tento postup
$configurator = new Nette\Configurator; // ! vytvoříš nový kontext, který je izolovaný
David říkal, že Configurator by se mělo chovat jednoinstančně, pokud se omylem použije new Configurator, ale očividně to nefunguje, takže správné je zůstat u toho, že na začátku bootstrapu použiji první řádek. (Nic mi nebrání použít druhý postup, ale pak nelze používat Environment, kbůli tomu, že má svůj context.))
Přečti si toto: https://forum.nette.org/…cy-injection
Pokud je DI složité, tak místo něj používej Environment, to není „extra
prohřešek“ – věci budou fungovat jako dřív, funkcionality se s tím
dá dosáhnout stejná, ale DI je „správnější návrh“
Editoval bojovyletoun (23. 5. 2011 17:25)
- studna
- Člen | 181
DI přece neznamená nepoužívat Environment. :-)
Ten hezčí způsob:
bootstrap.php
$conf = new Nette\Configurator();
$conf->loadConfig();
$cont = $conf->getContainer(); // = $conf->container
$cont->addService('database', function() use($cont)
{
return new DibiConnection( $cont->params['database'] );
});
$cont->addService('logger', function() use($cont)
{
return new TvujLogger( $cont->database );
});
$application = $cont->application;
// ...
TvujLogger.php
function __construct( DibiConnection $database )
{
$this->database = $database;
}
Presenter.php
function ...(){
$logger = $this->container->logger; // trida TvujLogger se instancuje pouze jednou
$logger = new TvujLogger( $this->container->database );
}
Dvojímu načítání configu se můžeš vyhnout i tak jak psal bojovyletoun, zaměnit řádek
$configurator = new Nette\Configurator;
za
$configurator = Nette\Environment::getConfigurator();
Snad jsem tam nenasekal nějaké chyby. :)
Editoval studna (23. 5. 2011 20:27)
- jazby
- Člen | 44
Tak tohle je mi už jasnější. O zmiňovaném vláknu https://forum.nette.org/…cy-injection vím a čtu jej, ale říkal jsem si že si ještě počkám, jelikož mám pocit že tam ještě proběhne bouřlivý vývoj :-)) Díky