Registrace DI extension v jiné CompilerExtension
- Petr Parolek
- Člen | 455
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. 2020 19:49)
- Felix
- Nette Core | 1245
Ano da. Mrkni zde https://github.com/…xtension.php.
V metodach loadConfiguration, beforeCompile a afterCompile provolas metody u tech extension, ktere chces obalit.
- Petr Parolek
- Člen | 455
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.
- Petr Parolek
- Člen | 455
Čá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. 2020 19:08)