%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/database/src/Bridges/DatabaseDI/ |
Current File : /www/varak.net/losik.varak.net/vendor/nette/database/src/Bridges/DatabaseDI/DatabaseExtension.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Bridges\DatabaseDI; use Nette; use Nette\Schema\Expect; use Tracy; /** * Nette Framework Database services. */ class DatabaseExtension extends Nette\DI\CompilerExtension { /** @var bool */ private $debugMode; public function __construct(bool $debugMode = false) { $this->debugMode = $debugMode; } public function getConfigSchema(): Nette\Schema\Schema { return Expect::arrayOf( Expect::structure([ 'dsn' => Expect::string()->required()->dynamic(), 'user' => Expect::string()->nullable()->dynamic(), 'password' => Expect::string()->nullable()->dynamic(), 'options' => Expect::array(), 'debugger' => Expect::bool(), 'explain' => Expect::bool(true), 'reflection' => Expect::string(), // BC 'conventions' => Expect::string('discovered'), // Nette\Database\Conventions\DiscoveredConventions 'autowired' => Expect::bool(), ]) )->before(function ($val) { return is_array(reset($val)) || reset($val) === null ? $val : ['default' => $val]; }); } public function loadConfiguration() { $autowired = true; foreach ($this->config as $name => $config) { $config->autowired = $config->autowired ?? $autowired; $autowired = false; $this->setupDatabase($config, $name); } } public function beforeCompile() { $builder = $this->getContainerBuilder(); foreach ($this->config as $name => $config) { if ($config->debugger ?? $builder->getByType(Tracy\BlueScreen::class)) { $connection = $builder->getDefinition($this->prefix("$name.connection")); $connection->addSetup( [Nette\Bridges\DatabaseTracy\ConnectionPanel::class, 'initialize'], [$connection, $this->debugMode, $name, !empty($config->explain)] ); } } } private function setupDatabase(\stdClass $config, string $name): void { $builder = $this->getContainerBuilder(); foreach ($config->options as $key => $value) { if (is_string($value) && preg_match('#^PDO::\w+$#D', $value)) { $config->options[$key] = $value = constant($value); } if (preg_match('#^PDO::\w+$#D', $key)) { unset($config->options[$key]); $config->options[constant($key)] = $value; } } $connection = $builder->addDefinition($this->prefix("$name.connection")) ->setFactory(Nette\Database\Connection::class, [$config->dsn, $config->user, $config->password, $config->options]) ->setAutowired($config->autowired); $structure = $builder->addDefinition($this->prefix("$name.structure")) ->setFactory(Nette\Database\Structure::class) ->setArguments([$connection]) ->setAutowired($config->autowired); if (!empty($config->reflection)) { $conventionsServiceName = 'reflection'; $config->conventions = $config->reflection; if (is_string($config->conventions) && strtolower($config->conventions) === 'conventional') { $config->conventions = 'Static'; } } else { $conventionsServiceName = 'conventions'; } if (!$config->conventions) { $conventions = null; } elseif (is_string($config->conventions)) { $conventions = $builder->addDefinition($this->prefix("$name.$conventionsServiceName")) ->setFactory(preg_match('#^[a-z]+$#Di', $config->conventions) ? 'Nette\Database\Conventions\\' . ucfirst($config->conventions) . 'Conventions' : $config->conventions) ->setArguments(strtolower($config->conventions) === 'discovered' ? [$structure] : []) ->setAutowired($config->autowired); } else { $conventions = Nette\DI\Helpers::filterArguments([$config->conventions])[0]; } $builder->addDefinition($this->prefix("$name.explorer")) ->setFactory(Nette\Database\Explorer::class, [$connection, $structure, $conventions]) ->setAutowired($config->autowired); $builder->addAlias($this->prefix("$name.context"), $this->prefix("$name.explorer")); if ($this->name === 'database') { $builder->addAlias($this->prefix($name), $this->prefix("$name.connection")); $builder->addAlias("nette.database.$name", $this->prefix($name)); $builder->addAlias("nette.database.$name.context", $this->prefix("$name.explorer")); } } }