• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nette / application / 19806242787

30 Nov 2025 11:07PM UTC coverage: 82.997% (+0.5%) from 82.489%
19806242787

push

github

dg
added #[TemplateVariable]

12 of 12 new or added lines in 2 files covered. (100.0%)

54 existing lines in 2 files now uncovered.

1933 of 2329 relevant lines covered (83.0%)

0.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.18
/src/Bridges/ApplicationLatte/TemplateFactory.php
1
<?php
2

3
/**
4
 * This file is part of the Nette Framework (https://nette.org)
5
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6
 */
7

8
declare(strict_types=1);
9

10
namespace Nette\Bridges\ApplicationLatte;
11

12
use Nette;
13
use Nette\Application\UI;
14
use function class_exists, is_a, preg_replace, property_exists, rtrim;
15

16

17
/**
18
 * Latte powered template factory.
19
 */
20
class TemplateFactory implements UI\TemplateFactory
21
{
22
        /** @var array<callable(Template): void>  Occurs when a new template is created */
23
        public array $onCreate = [];
24
        private string $templateClass;
25

26

27
        public function __construct(
1✔
28
                private readonly LatteFactory $latteFactory,
29
                private readonly ?Nette\Http\IRequest $httpRequest = null,
30
                private readonly ?Nette\Security\User $user = null,
31
                $templateClass = null,
32
        ) {
33
                if ($templateClass && (!class_exists($templateClass) || !is_a($templateClass, Template::class, true))) {
1✔
34
                        throw new Nette\InvalidArgumentException("Class $templateClass does not implement " . Template::class . ' or it does not exist.');
1✔
35
                }
36

37
                $this->templateClass = $templateClass ?? DefaultTemplate::class;
1✔
38
        }
1✔
39

40

41
        /** @return Template */
42
        public function createTemplate(?UI\Control $control = null, ?string $class = null): UI\Template
1✔
43
        {
44
                $class ??= $this->templateClass;
1✔
45
                if (!is_a($class, Template::class, allow_string: true)) {
1✔
UNCOV
46
                        throw new Nette\InvalidArgumentException("Class $class does not implement " . Template::class . ' or it does not exist.');
×
47
                }
48

49
                $latte = $this->latteFactory->create($control);
1✔
50
                $template = new $class($latte);
1✔
51
                $this->injectDefaultVariables($template, $control);
1✔
52

53
                Nette\Utils\Arrays::invoke($this->onCreate, $template);
1✔
54

55
                return $template;
1✔
56
        }
57

58

59
        private function injectDefaultVariables(Template $template, ?UI\Control $control): void
1✔
60
        {
61
                $presenter = $control?->getPresenterIfExists();
1✔
62
                $baseUrl = $this->httpRequest
1✔
63
                        ? rtrim($this->httpRequest->getUrl()->withoutUserInfo()->getBaseUrl(), '/')
1✔
64
                        : null;
1✔
65
                $flashes = $presenter instanceof UI\Presenter && $presenter->hasFlashSession()
1✔
UNCOV
66
                        ? (array) $presenter->getFlashSession()->get($control->getParameterId('flash'))
×
67
                        : [];
1✔
68

69
                $vars = [
1✔
70
                        'user' => $this->user,
1✔
71
                        'baseUrl' => $baseUrl,
1✔
72
                        'basePath' => $baseUrl ? preg_replace('#https?://[^/]+#A', '', $baseUrl) : null,
1✔
73
                        'flashes' => $flashes,
1✔
74
                        'control' => $control,
1✔
75
                        'presenter' => $presenter,
1✔
76
                ];
77

78
                foreach ($vars as $key => $value) {
1✔
79
                        if ($value !== null && property_exists($template, $key)) {
1✔
80
                                try {
81
                                        $template->$key = $value;
1✔
UNCOV
82
                                } catch (\TypeError) {
×
83
                                }
84
                        }
85
                }
86
        }
1✔
87
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc