BaseUri v konfigu__________

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

Potreboval bych v konfigu parametr baseUri, bohuzel netusim jak na to.
Pokusy tohoto typu selhaly…

parameters:
	baseUri: @httpRequest::getUrl()::getBasePath()

Editoval hrach (17. 2. 2012 23:27)

awsickness
Člen | 98
+
0
-

a neslo by predat kam potrebujes @httpRequest a pak si to v service nebo kde potrebujes vytahnout ?

hrach
Člen | 1834
+
0
-

prevadim starou aplikaci a mam tam neco jako

parameters:
	cssUri: %baseUri%/css/

takze se snazim toto nejak zprovoznit…

Tharos
Člen | 1030
+
0
-

Podobný obrat se mi v neonu taky nepodařilo zkonstruovat a taky jsem zkoušel leccos… Jednoduchým workaroundem je samozřejmě vytvoření samostatné služby, která bude z httpRequest požadovanou baseUri generovat… (Ale to už Tě určitě taky napadlo.)

hrach
Člen | 1834
+
0
-

@Tharos: ohledně samostatné služby – můžeš uvést příklad?

llook
Člen | 407
+
0
-

Taky jsem se na něčem podobném nedávno zasekl. Chtěl jsem továrnu, která by nevracela objekt, ale řetězec (šlo o továrnu na UUID). Na nic jsem nepřišel, myslím, že to nejde.

To s tím baseUri bych zatím řešil buďto vepsáním cest natvrdo do konfiguráku, nebo nějakou magií v bootstrapu:

$baseUri = dirname($_SERVER['SCRIPT_NAME']);
$configurator->addParameters(array('baseUri' => $baseUri));
hrach
Člen | 1834
+
0
-

Nejvic na tom me stve to, ze je to zalezitost jen pro localni vyvoj u ruznych developeru :D v production modech je to vsechno natvrdo :D

Hack pres addParameter bude asi jedine mozne reseni. Tedy pro tuto chvili. :)

hrach
Člen | 1834
+
0
-

@uestla: jo, to sem uz zkousel, problem bude v tom, ze expand se zrejme vola driv, nez se vyfactoruje hodnota baseUri, takze koncim na chybe:

Unable to concatenate non-scalar parameter 'baseUri' into '%baseUri%photos'.

Pac v tu chvili je baseUri jeste:

baseUri => stdClass(2) ▼ {
   value => "@urlScript::getScriptPath" (25)
   attributes => array(0)
}
Tharos
Člen | 1030
+
0
-

S tou pomocnou službou jsem to myslel zhruba následovně:

services:
	baseUri: BaseUri
	foo: Foo(@baseUri::get(), '/path/to/css')
<?php

use Nette\Http;

class BaseUri
{

	private $request;

	public function __construct(Http\Request $request)
	{
		$this->request = $request;
	}

	public function get()
	{
		return rtrim($this->request->getUrl()->getBasePath(), '/');
	}

}
<?php

class Foo
{

	/** @var string */
	private $baseUri;

	/** @var string */
	private $pathToCss;

	public function __construct($baseUri, $pathToCss)
	{
		$this->baseUri = $baseUri;
		$this->pathToCss = $pathToCss;
	}

	public function getFullPath()
	{
		return $this->baseUri . $this->pathToCss;
	}

}

Přiznávám ale, že to možná není úplně to, co hledáš… Přímo mezi parametry se to tak totiž taky propasovat nedá. Jestli to chceš mít mezi parametry, asi to opravdu nepůjde bez „dolazení“ kontejneru z PHP.

Michal Vyšinský
Člen | 608
+
0
-

Ahoj,
já basePath v konfigu řeším tak, že mám třídu se statickou metodou „getBasePath“:

class PathFinder {
	public static function getBasePath($wwwDir) {
		return str_replace($_SERVER["DOCUMENT_ROOT"], null, $wwwDir);
	}
}

A v bootstrap.php před vytvořením kontejneru mám:

$configurator->addParameters(array(
    "basePath" => PathFinder::getBasePath(WWW_DIR)
));

Zatím mi to všude fungovalo bez problému. %basePath% se v config.neon převedlo na basePath, který vrátil PathFinder.

hrach
Člen | 1834
+
0
-

@Tharos: nojo, on nebude problem to davat jako jako argument sluzbe, potrebuju to mit ale definovany jako parametr no…

David Grudl
Nette Core | 8147
+
0
-

Co mají znamenat ty ____ v titulku? Ten znakový limit tam je právě proto, aby někdo nezakládal tak hloupé vlákna jako „baseuri v konfigu“.

hrach
Člen | 1834
+
0
-

Jak, Davide, vidíš, špatně uvažuješ. Restrikcí téměř nikdy nedocílíš lepších výsledků. Osoboně naopak nesnáším dlouhé titulky, které protlačují zbytečnou omáčku. O používání slov aneb nemluvě, vypadá to pak, že se člověk neumí vyjádřit napoprvé.

David Grudl
Nette Core | 8147
+
0
-

A co řekne titulek „baseUri v konfigu“? Dovedeš si pod tím něco smysluplného představit?

Tomáš Votruba
Moderator | 1114
+
0
-
Filip Procházka
Moderator | 4668
+
0
-

Hehe, to je staré jak Jeruzalém :) Nemyslím si, že by to takto snadno fungovalo i v aktuálním Nette.

Nox
Člen | 378
+
0
-

Takhle je to pro aktuální Nette:

https://gist.github.com/1883493

Editoval Nox (22. 2. 2012 18:32)

Filip Procházka
Moderator | 4668
+
0
-

@**Nox**: a teď si otevři třídu Nette\Config\Configurator a pořádně se zamysli, proč je to špatně.

Tip 1: V Configuratoru $this->container nezavoláš a i kdybys volal $this->createContainer(), tak se ti bude generovat DI Container 2x
Tip 2: Tohle jsou run-time parametry, nemůžeš je tedy generovat do containeru compile-time, protože by pro všechny requesty byly stejné ⇒ průser.

(PS: Do kdyby si to samozřejmě dát můžu, protože mám Configurator obalený :)

Nox
Člen | 378
+
0
-

Container to je fakt, to jsem šlohl z předchozího … ale pro statické věci to funguje

Honza Marek
Člen | 1664
+
0
-

Taky to potřebuju každou chvíli. Jedno z dalších řešení je mít v lokální konfiguraci nastavený parametr natvrdo na nějaké „/web/www“.

Teyras
Člen | 81
+
0
-

Naštve, že se David vyjádřil k titulku, ale k samotnýmu tématu ani náhodou. Tohle si zaslouží řešení, taky už jsem to musel párkrát oblejzat…

pawouk
Člen | 172
+
0
-

Také se přikláním k vyřešení :-) ještě jsem občas něco podobného řešil s persistentnim parametrem lang. Který mám až po nastartování presenteru, ale potřeboval bych ho předávat do některých component v configu. Pak je nutné mít ve:

startup(){
parent::startup()
	$this->context->parameters['lang'] = $this->lang;
	$this->context->parameters['basePAth'] = $this->basePath;
}

Občas to stačí, ale občas je ve startupu už pozdě…