1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Bridges\DatabaseDI;
9:
10: use Nette,
11: Nette\DI\ContainerBuilder;
12:
13:
14: 15: 16: 17: 18: 19:
20: class DatabaseExtension extends Nette\DI\CompilerExtension
21: {
22:
23: public $databaseDefaults = array(
24: 'dsn' => NULL,
25: 'user' => NULL,
26: 'password' => NULL,
27: 'options' => NULL,
28: 'debugger' => TRUE,
29: 'explain' => TRUE,
30: 'reflection' => 'Nette\Database\Reflection\DiscoveredReflection',
31: 'autowired' => NULL,
32: );
33:
34:
35: public function loadConfiguration()
36: {
37: $container = $this->getContainerBuilder();
38:
39: $config = $this->compiler->getConfig();
40: if (isset($config['nette']['database'])) {
41: $config = $config['nette']['database'];
42: $prefix = 'nette.';
43: } else {
44: $config = isset($config[$this->name]) ? $config[$this->name] : array();
45: $prefix = '';
46: }
47:
48: if (isset($config['dsn'])) {
49: $config = array('default' => $config);
50: }
51:
52: $autowired = TRUE;
53: foreach ((array) $config as $name => $info) {
54: if (!is_array($info)) {
55: continue;
56: }
57: $this->validate($info, $this->databaseDefaults, 'database');
58:
59: $info += array('autowired' => $autowired) + $this->databaseDefaults;
60: $autowired = FALSE;
61:
62: foreach ((array) $info['options'] as $key => $value) {
63: if (preg_match('#^PDO::\w+\z#', $key)) {
64: unset($info['options'][$key]);
65: $info['options'][constant($key)] = $value;
66: }
67: }
68:
69: $connection = $container->addDefinition($prefix . $this->prefix($name))
70: ->setClass('Nette\Database\Connection', array($info['dsn'], $info['user'], $info['password'], $info['options']))
71: ->setAutowired($info['autowired'])
72: ->addSetup('Tracy\Debugger::getBlueScreen()->addPanel(?)', array(
73: 'Nette\Bridges\DatabaseTracy\ConnectionPanel::renderException'
74: ));
75:
76: if (!$info['reflection']) {
77: $reflection = NULL;
78: } elseif (is_string($info['reflection'])) {
79: $reflection = new Nette\DI\Statement(preg_match('#^[a-z]+\z#', $info['reflection'])
80: ? 'Nette\Database\Reflection\\' . ucfirst($info['reflection']) . 'Reflection'
81: : $info['reflection'], strtolower($info['reflection']) === 'discovered' ? array($connection) : array());
82: } else {
83: $tmp = Nette\DI\Compiler::filterArguments(array($info['reflection']));
84: $reflection = reset($tmp);
85: }
86:
87: $container->addDefinition($prefix . $this->prefix("$name.context"))
88: ->setClass('Nette\Database\Context', array($connection, $reflection))
89: ->setAutowired($info['autowired']);
90:
91: if ($container->parameters['debugMode'] && $info['debugger']) {
92: $connection->addSetup('Nette\Database\Helpers::createDebugPanel', array($connection, !empty($info['explain']), $name));
93: }
94: }
95: }
96:
97:
98: private function validate(array $config, array $expected, $name)
99: {
100: if ($extra = array_diff_key($config, $expected)) {
101: $extra = implode(", $name.", array_keys($extra));
102: throw new Nette\InvalidStateException("Unknown option $name.$extra.");
103: }
104: }
105:
106: }
107: