1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Bridges\HttpDI;
9:
10: use Nette;
11:
12:
13: 14: 15:
16: class SessionExtension extends Nette\DI\CompilerExtension
17: {
18: public $defaults = [
19: 'debugger' => false,
20: 'autoStart' => 'smart',
21: 'expiration' => null,
22: ];
23:
24:
25: private $debugMode;
26:
27:
28: private $cliMode;
29:
30:
31: public function __construct($debugMode = false, $cliMode = false)
32: {
33: $this->debugMode = $debugMode;
34: $this->cliMode = $cliMode;
35: }
36:
37:
38: public function loadConfiguration()
39: {
40: $builder = $this->getContainerBuilder();
41: $config = $this->getConfig() + $this->defaults;
42: $this->setConfig($config);
43:
44: $session = $builder->addDefinition($this->prefix('session'))
45: ->setFactory(Nette\Http\Session::class);
46:
47: if ($config['expiration']) {
48: $session->addSetup('setExpiration', [$config['expiration']]);
49: }
50: if (isset($config['cookieDomain']) && $config['cookieDomain'] === 'domain') {
51: $config['cookieDomain'] = $builder::literal('$this->getByType(Nette\Http\IRequest::class)->getUrl()->getDomain(2)');
52: }
53:
54: if ($this->debugMode && $config['debugger']) {
55: $session->addSetup('@Tracy\Bar::addPanel', [
56: new Nette\DI\Statement(Nette\Bridges\HttpTracy\SessionPanel::class),
57: ]);
58: }
59:
60: unset($config['expiration'], $config['autoStart'], $config['debugger']);
61: if (!empty($config)) {
62: $session->addSetup('setOptions', [$config]);
63: }
64:
65: if ($this->name === 'session') {
66: $builder->addAlias('session', $this->prefix('session'));
67: }
68: }
69:
70:
71: public function afterCompile(Nette\PhpGenerator\ClassType $class)
72: {
73: if ($this->cliMode) {
74: return;
75: }
76:
77: $initialize = $class->getMethod('initialize');
78: $config = $this->getConfig();
79: $name = $this->prefix('session');
80:
81: if ($config['autoStart'] === 'smart') {
82: $initialize->addBody('$this->getService(?)->exists() && $this->getService(?)->start();', [$name, $name]);
83:
84: } elseif ($config['autoStart']) {
85: $initialize->addBody('$this->getService(?)->start();', [$name]);
86: }
87: }
88: }
89: