Registrace DI extension v jiné CompilerExtension

ppar
Backer | 326
+
0
-

Ahoj, dá se prosím nějak zaregistrovat nettrine dbal a orm extension ve vlastní di extension?

Jde mi o to, aby po zaregistrování BaseExtension již obsahovala:

extensions:
	console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)

	nettrine.dbal: Nettrine\DBAL\DI\DbalExtension
	nettrine.cache: Nettrine\Cache\DI\CacheExtension
	nettrine.orm: Nettrine\ORM\DI\OrmExtension
	nettrine.orm.cache: Nettrine\ORM\DI\OrmCacheExtension
	nettrine.orm.console: Nettrine\ORM\DI\OrmConsoleExtension(%consoleMode%)
	nettrine.annotations: Nettrine\Annotations\DI\AnnotationsExtension
	nettrine.orm.annotations: Nettrine\ORM\DI\OrmAnnotationsExtension

console:
	name: Foo
	catchExceptions: true

nettrine.dbal:
	debug:
		panel: %debugMode%
	connection:
		driver: pdo_mysql
		host: %dbHost%
		dbname: %dbName%
		user: %dbUser%
		password: %dbPassword%

nettrine.orm:
	# Own em class
	entityManagerDecoratorClass: App\Model\EntityManagerDecorator

Jde to nějak prosím?

Editoval ppar (14. 3. 19:49)

Felix
Nette Core | 1040
+
0
-

Ano da. Mrkni zde https://github.com/…xtension.php.

V metodach loadConfiguration, beforeCompile a afterCompile provolas metody u tech extension, ktere chces obalit.

ppar
Backer | 326
+
0
-

zrovna před chvilkou jsem se koukal do dokumentace contributte di a nic zajímavého jsem neobjevil. Mám vyzobat třídu nebo mám použít celé contributte extension? V doc jsem nic k mému problému nenašel.

ppar
Backer | 326
+
0
-

Částečně vyřešeno:

<?php
declare(strict_types=1);

namespace App;

use Nette\Configurator;
use Nette\Utils\Finder;

class Bootstrap
{

	public static function boot(): Configurator
	{
		$configurator = new Configurator;

		@mkdir(__DIR__ . '/../temp/sessions', 0777, true);

		$configurator->setDebugMode(TRUE);

		$configurator->enableTracy(__DIR__ . '/../log');

		$configurator->setTimeZone('Europe/Prague');
		$configurator->setTempDirectory(__DIR__ . '/../temp');

		$configurator->createRobotLoader()
			->addDirectory(__DIR__)
			->addDirectory(__DIR__ . '/../libs')
			->register();

		$configurator
			->addConfig(__DIR__ . '/config/common.neon')
			->addConfig(__DIR__ . '/config/local.neon')
			->addConfig(__DIR__ . '/config/local.parameters.neon');

		$dir = __DIR__ . '/config/extensions';
		if (file_exists($dir)) {
			foreach (Finder::findFiles('*.neon')->from($dir) as $file) {
				$configurator->addConfig($file->getPathname());
			}
		}

		return $configurator;
	}
}
?>
<?php

namespace Foo\Base\DI;

use Nette\DI\CompilerExtension;
use Nette\Utils\FileSystem;

class BaseExtension extends CompilerExtension
{

	public function loadConfiguration()
	{
		$appDir = $this->compiler->getConfig()['parameters']['appDir'];
		$source = __DIR__ . '/extensions';
		$dest = $appDir . '/config/extensions';
		FileSystem::copy($source, $dest);
	}
}
?>

Akorát toto řešení má takovou mouchu, musím dvakrát načíst stránku, protože kod nenačte neony.

Zkusil jsem upravit www/index.php:

<?php
declare(strict_types=1);

require __DIR__ . '/../vendor/autoload.php';

App\Bootstrap::boot()
	->createContainer()
	->getByType(Nette\Application\Application::class);

App\Bootstrap::boot()
	->createContainer()
	->getByType(Nette\Application\Application::class)
	->run();
?>

Funguje to, jen mi celé řešení připadne jaksi nečisté. Navíc metoda $this->compiler->getConfig() je označená jako deprecated, což vůbec nechápu, jak proč a jak to nahradit. Co si myslíte?

EDIT:

<?php

namespace Foo\Base\DI;

use Nette\DI\CompilerExtension;
use Nette\Utils\FileSystem;

class BaseExtension extends CompilerExtension
{

	/**
	 * @var string
	 */
	public $appDir;

	public function __construct($appDir)
	{
		$this->appDir = $appDir;
	}

	public function loadConfiguration()
	{
		$source = __DIR__ . '/extensions';
		$dest = $this->appDir . '/config/extensions';
		FileSystem::copy($source, $dest);
	}
}
?>

a v app/config/common.neon mám

extensions:
	- Foo\Base\DI\BaseExtension(%appDir%)

toto už vypadá líp

Editoval ppar (16. 3. 19:08)