Načíst soubor common.neon dle Modulu
- vosy
- Člen | 525
Ahoj jak upravit Bootstrap.php, aby načetl config soubor, dle toho v jakém
modulu se právě nachází uživatel?
Děkuji
<?php
declare(strict_types=1);
namespace App;
use Nette\Bootstrap\Configurator;
class Bootstrap
{
public static function boot(): Configurator
{
$configurator = new Configurator;
.....
###### NAČÍST VŽDY ######
$configurator->addConfig($appDir . '/config/common.neon');
###### NAČÍST KDYŽ JSEM V ADMINMODULE ######
$configurator->addConfig($appDir . '/app/AdminModule/config/common.neon');
###### NAČÍST KDYŽ JSEM V USERMODULE ######
$configurator->addConfig($appDir . '/app/UserModule/config/common.neon');
###### NAČÍST KDYŽ JSEM NA LOCALU ######
$configurator->addConfig($appDir . '/config/local.neon');
......
return $configurator;
}
}
- Marek Bartoš
- Nette Blogger | 1171
Co přesně se snažíš udělat? Takhle to fungovat nemůže.
V jakém jsi modulu víš až když Nette\Application\Application matchne
routu. Na což potřebuješ mít zkompilovaný DIC. DIC se kompiluje na
základě přidaných konfiguračních souborů.
Routa se nemusí matchnout vůbec, například v konzoli.
A i kdyby se ti tuhle cyklickou závislost podařilo vyřešit (nedoporučuju
zkoušet), tak narazíš na to, že si z admin modulu na user modul ani
nevytvoříš odkaz, protože presenter v user modulu nebude mít dostupné
služby, které v user configu registruješ.
- m.brecher
- Generous Backer | 758
Ahoj,
řešil jsem před časem část tvého problému – načíst konfigurační soubor pouze pro vývojový stroj na domácím PC. Dobré řešení je toto:
class Bootstrap
{
public static function boot(): Configurator
{
$configurator = new Configurator;
$appDir = dirname(__DIR__);
.......
$configurator->addConfig($appDir . '/config/common.neon'); // local i remote
$configurator->addConfig($appDir . '/config/services.neon'); // local i remote
if($_SERVER['HTTP_HOST'] === 'localhost'){
$configurator->addConfig($appDir . '/config/local.neon'); // jen local
}
return $configurator;
}
Je potřeba, aby bylo na domácím PC stroji nastaveno jméno „localhost“ na IP adresu 127.0.0.1 což se dělá v systémovém souboru hosts ve Windows.
V Bootstrapu totiž není z Nette k dispozici skoro nic, takže je potřeba jít přímo do PHP. Konfigurační soubory pro jednotlivé moduly neumím, v Bootstrapu to asi nepůjde, ale mohlo by to jít v hlavním konfiguračním souboru.
Editoval m.brecher (2. 10. 2022 15:10)
- m.brecher
- Generous Backer | 758
Ano, jak vysvětlil @MarekBartoš v Bootstrapu není z čeho zjistit modul, protože ten závisí na konfiguraci. Takže asi bude nejlepší touto cestou nejít.
Naproti tomu mít konfiguraci jenom pro lokální stroj je šikovné, protože typicky připojení k databázi může být jiné na local serveru a na remote serveru. Není pak potřeba stále hlídat, aby se soubor local.neon omylem nenahrál ve verzi pro remote server (production).
V jedné z diskuzí na toto téma zde ale byl rozšířený názor, že soubor local.neon by měl obsahovat specifickou konfiguraci pro konkrétní server, bez ohledu na to, jestli local nebo remote, to je užitečné v případě, kdy se aplikace distribuje na více různých serverů.
Editoval m.brecher (2. 10. 2022 15:20)
- Marek Bartoš
- Nette Blogger | 1171
Localhost vs produkce lze řešit hrozně jednoduše při automatizovazeném
deployi. Vždycky načítám local.neon. Při deployi na stable se jen
přejmenuje stable.neon na local.neon.
Případně local.neon ignorovat při deployi a nahrát jej na server
manuálně.
Není třeba nic podmínkovat. Zrovna podmínka na localhost by nefungovala v konzoli.
- m.brecher
- Generous Backer | 758
@MarekBartoš
Ahoj, takže jestli jsem to pochopil, tak soubor /config/local.neon vyřadíš z automatického deploye a soubor si nahraješ sám ručně. Manuálně si ohlídáš, že nepošleš local.neon, ale nejprve přejmenuješ local.neon např. na local_local.neon a stable.neon na local.neon, pak local.neon ručně nahraješ a zase soubory přejmenuješ zpátky? Asi je to OK, local.neon se bezpochyby nemění skoro vůbec, obvykle stačí nahrát jednou.
Já třeba konzoli nepoužívám, takže me podmínka nevadí a nemusím se přejmenováním local.neon vůbec zabývat.
- Marek Bartoš
- Nette Blogger | 1171
Při deployi se jen zavolá mv stable.neon local.neon
, je to
plně automatické. Jediné co dělám manuálně je nahrání souborů
s loginy na server a ten je při deployi ignorovaný. Nic hlídat nemusím, jen
doplňuju loginy na nové integrace.
- Ondris
- Člen | 37
Pro přidání configu pouze pro lokální vývoj je ještě jednodušší cesta:
if ($configurator->isDebugMode()) {
$configurator->addConfig($appDir . '/config/local.neon');
}
Ale to je něco dost jiného, jako přidání configu podle modulu. Jak bylo napsáno výše, je to problém, protože první se provede kompilace a až pak aplikace prodle routy zjistí, ve kterém je modulu.
- Marek Bartoš
- Nette Blogger | 1171
@Ondris pokud sám nenastavuješ podmínky, při kterých se debug
mód zapne, tak se používá fallback s automatickou detekcí, který je
efektivně totéž, co $_SERVER['HTTP_HOST'] === 'localhost'
,
s tím, že navíc funguje i za proxy https://github.com/…igurator.php#L339
A předpoklad, že debug mód je pouze na lokálním serveru není dobrý. Často se hodí s debug módem zjistit, jak se něco chová na produkci. U nás v produkci zapínáme debug mód pomocí cookie, na kliknutí v administraci https://github.com/…cs/README.md#…