Načíst soubor common.neon dle Modulu

vosy
Člen | 525
+
0
-

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
+
+2
-

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
+
-2
-

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
+
-2
-

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
+
+3
-

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
+
0
-

@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
+
+2
-

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.

Kamil Valenta
Člen | 762
+
0
-

vosy napsal(a):

Jaký je důvod nenačítat vždy vše? Co se snažíš ušetřit?

Ondris
Člen | 37
+
0
-

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
+
0
-

@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#…