BaseUri v konfigu__________
- awsickness
- Člen | 98
a neslo by predat kam potrebujes @httpRequest a pak si to v service nebo kde potrebujes vytahnout ?
- llook
- Člen | 407
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 | 1838
@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
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
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.
- David Grudl
- Nette Core | 8227
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“.
- David Grudl
- Nette Core | 8227
A co řekne titulek „baseUri v konfigu“? Dovedeš si pod tím něco smysluplného představit?
- Filip Procházka
- Moderator | 4668
Hehe, to je staré jak Jeruzalém :) Nemyslím si, že by to takto snadno fungovalo i v aktuálním Nette.
- Filip Procházka
- Moderator | 4668
@**Nox**: a teď si otevři třídu
Nette\Config\Configurator
a pořádně se zamysli, proč je to
špatně.
Tip 1: V Configurator
u $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ý :)
- Honza Marek
- Člen | 1664
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“.
- pawouk
- Člen | 172
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ě…