ex­pand proměnných v config.neon

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

Mám problém při expandování vlastní proměnné.

bootsrap.php

	$configurator = new Nette\Configurator;
	$configurator->container->params['databaseName'] = 'database';
	$configurator->loadConfig(__DIR__ . '/config.neon');

config.neon

development < common:
	database:
		driver: mysql
		host: localhost
		username: root
		database: %databaseName%

Vyhodí chybu Missing item ‚databaseName‘. Když jsem dumpoval, v případě expandování opravdu není.
Ale pokud proměnnou použiji např. v services, tak deklarovaná je.

Nebo pokud místo %databaseName% napíši %appDir% tak také funguje. Poradíte mi jak jinak definovat proměnnou nebo je chyba v nette?

Nette Framework 2.0-beta (revision 648b258 released on 2011–06–13)

díky :)

Editoval zarubik (21. 6. 2011 18:39)

kravčo
Člen | 721
+
0
-

Bez viac informácií o JZ\Shop\Configurator ťažko povedať…

zarubik
Člen | 31
+
0
-

upraveno .. dela to same i s Nette\Configurator. Zkoušel jsi to primte u tebe?
Ja to nakonec resim uplne jinak (vlastním configem), ale mozna by se to nekomu hodilo, az na to narazi.

washo
Člen | 88
+
0
-

Taky mam problem s expanzi vlastnich promennych i u ini souboru.

Editoval washo (22. 6. 2011 21:35)

iguana007
Člen | 970
+
0
-

taky mi to nefunguje – v předchozích verzích Nette to běhalo v pohodě.

Nette: 2.0-beta 477ba20 released on 2011–06–24

David Grudl
Nette Core | 8142
+
0
-

zarubikuv priklad mi normalne funguje…

_Martin_
Generous Backer | 679
+
0
-

Bylo by možné zprovoznit i něco takového?

api:
	base: http://example.com/api
	products:
		add: %api.base%/products/add
		list: %api.base%/products
	categories:
		add: %api.base%/categories/add
		list: %api.base%/categories
Filip Procházka
Moderator | 4668
+
0
-

Vždyť to funguje! A jestli ne, tak to dej do uvozovek.

_Martin_
Generous Backer | 679
+
0
-

Obávám se, že nefunguje – pro jistotu jsem stáhl aktuální beta verzi (prefixovanou) a taky nic. Ani s uvozovkami, ani bez nich.

Edit: Vždy vrací chybu Missing item 'api'.

Editoval _Martin_ (29. 6. 2011 14:03)

Filip Procházka
Moderator | 4668
+
0
-

Aha, a nemyslí si to, že api je sekce?

_Martin_
Generous Backer | 679
+
0
-

Nevím, co si to myslí, ale rád bych, aby to nahradil za http://example.com/api – čili za hodnotu ze sekce api, podsekce base.

David Grudl
Nette Core | 8142
+
0
-

Jde o to, jestli máš:

development:
	api:
        	base: http://example.com/api
_Martin_
Generous Backer | 679
+
0
-

Mám to v sekci common.

washo
Člen | 88
+
0
-

A je stale zachovana ta vlastnost ze kdyz si definuju treba v indexu konstantu napriklad DATA_DIR tak ze se to dostane do configu jako %dataDir%? Abych to potom mohl napsat do configu

	variables:
		invoiceDir: %dataDir%/invoices

(s uvozovkama i bez)

protoze me to vyhodi pri pouziti vyjimku: Unable to expand variables: invoiceDir

PHP 5.2.17
Apache/2.2.19 (Win32) PHP/5.2.17
Nette Framework 2.0-beta (revision 926e7fd released on 2011–06–30)

David Grudl
Nette Core | 8142
+
0
-

Není. Z důvodů zpětné kompatibility se sice přenášejí konstanty WWW_DIR, APP_DIR, LIBS_DIR a TEMP_DIR, ale i od toho bych rád odešel. Přece jen, je to určitá magie.

Vhodnější by asi bylo dosáhnout stavu, kdy by index.php místo

// absolute filesystem path to the web root
define('WWW_DIR', __DIR__);

// absolute filesystem path to the application root
define('APP_DIR', WWW_DIR . '/../app');

// absolute filesystem path to the temporary files
define('TEMP_DIR', WWW_DIR . '/../temp');

// load bootstrap file
require APP_DIR . '/bootstrap.php';

obsahoval

// absolute filesystem path to the web root
$params['wwwDir'] = __DIR__;

// absolute filesystem path to the application root
$params['appDir'] = realpath(__DIR__ . '/../app');

// absolute filesystem path to the temporary files
$params['tempDir'] = realpath(__DIR__ . '/../temp');

// load bootstrap file
require "$params[appDir]/bootstrap.php";

a poté v bootstrapu by bylo něco jako

$configurator = new Nette\Configurator;
$configurator->container->params += $params;
$container = $configurator->loadConfig(__DIR__ . '/config.neon');

Což by mělo fungovat (jen je třeba specifikovat cestu Debugger::$logDirectory), leč zápisem se mi to vůbec nelíbí. Spíš by se šiklo něco jako:

$container = Nette\Configurator::fromFile($params, '%appDir%/config.neon');

// eventuálně
$container = Nette\Configurator::fromParams($params); // výchozí hodnota '%appDir%/config.neon'
washo
Člen | 88
+
0
-

A co potom s logDirem? Ja uz v tom mam trochu gulas. Definuju ted cesty na trech mistech. V indexu v bootstrapu a v neonu.

David Grudl
Nette Core | 8142
+
0
-

Záleží na tom, jaké cesty a kdo je používá.

logDir nastav přímo třídě Debugger:

Debugger::$logDirectory = ...;
Debugger::enable();
bojovyletoun
Člen | 667
+
0
-

nápad na odstranění konstant je dobrý, akorát to zase způsobí problémy s kompatibilitou. Nicméně, já mám v index.php pouze require a zbytek v bootstrapu. V neonu podle mě stačí definovat jen relativní cesty – např pro spojení %appDir%/models/sqlite.db

<?php
use ...;
$libs=__DIR__.'/../../../libs';
require $libs . '/Nette/loader.php';
Debugger::enable(null, __DIR__ . "/log");
$cf=new \Nette\Configurator();
$c = $cf->container;
$c->params['libsDir']=$libs;
$c->params['appDir']=__DIR__;
$c->params['tempDir']=__DIR__.'/temp';
$cf->loadConfig();
$ro = $c->robotLoader;
David Grudl
Nette Core | 8142
+
0
-

_Martin_ napsal(a):

Mám to v sekci common.

Už rozumím, opraveno v poslední verzi.

_Martin_
Generous Backer | 679
+
0
-

@David Grudl: Díky=)