Skip to content

Commit 521a2ab

Browse files
committed
BaseConfigurator: %baseUrl% parameter
1 parent 9be7327 commit 521a2ab

File tree

9 files changed

+104
-5
lines changed

9 files changed

+104
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1313
- Description of the parameters
1414
- `BaseConfigurator`
1515
- `%productionMode%` parameter (matches nette/bootstrap behavior)
16+
- `%baseUrl%` parameter (matches nette/bootstrap behavior)
1617

1718
## [1.3.5](https://github.com/orisai/nette-di/compare/1.3.4...1.3.5) - 2025-01-18
1819

docs/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,10 @@ Configurator define some parameters you may need:
346346
- defaults to `%rootDir%/vendor`
347347
- `%wwwDir%`
348348
- public directory, should be the only one accessible via webserver - defaults to `%rootDir%/public`
349+
- `%baseUrl%`
350+
- base url of your app
351+
- e.g. `https//example.com`
352+
- requires [nette/http](https://github.com/nette/http)
349353
- `%debugMode%`
350354
- whether application is in debug mode
351355
- `%productionMode%`

src/Boot/BaseConfigurator.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
use Nette\DI\Config\Loader;
1515
use Nette\DI\Container;
1616
use Nette\DI\ContainerLoader;
17+
use Nette\DI\Definitions\Statement;
1718
use Nette\DI\Extensions\ExtensionsExtension;
1819
use Nette\DI\Helpers as DIHelpers;
1920
use Nette\PhpGenerator\Literal;
2021
use Nette\Schema\Helpers as ConfigHelpers;
22+
use OriNette\DI\Boot\Parameters\BaseUrl;
2123
use Orisai\Utils\Dependencies\Dependencies;
2224
use Orisai\Utils\Dependencies\Exception\PackageRequired;
2325
use ReflectionClass;
@@ -26,6 +28,7 @@
2628
use Tracy\Debugger;
2729
use Traversable;
2830
use function array_keys;
31+
use function array_merge;
2932
use function assert;
3033
use function class_exists;
3134
use function filemtime;
@@ -87,6 +90,7 @@ protected function getDefaultParameters(): array
8790
'tempDir' => $this->rootDir . '/var/cache',
8891
'vendorDir' => $this->rootDir . '/vendor',
8992
'wwwDir' => $this->rootDir . '/public',
93+
'baseUrl' => new Statement('@' . BaseUrl::class . '::get'),
9094
'debugMode' => false,
9195
'productionMode' => true,
9296
'consoleMode' => PHP_SAPI === 'cli',
@@ -181,22 +185,26 @@ private function generateContainer(Compiler $compiler, array $configFiles): void
181185
$loader->addAdapter($extension, $adapter);
182186
}
183187

188+
$compiler->loadConfig(__DIR__ . '/Parameters/wiring.neon');
184189
foreach ($configFiles as $configFile) {
185190
$compiler->loadConfig($configFile, $loader);
186191
}
187192

188193
$now = new DateTimeImmutable();
189194

190-
$parameters = DIHelpers::escape($this->staticParameters) +
191-
[
195+
$parameters = DIHelpers::escape($this->staticParameters)
196+
+ [
192197
'container' => [
193198
'compiledAtTimestamp' => (int) $now->format('U'),
194199
'compiledAt' => $now->format(DATE_ATOM),
195200
'className' => new Literal('static::class'),
196201
],
197202
];
198203
$compiler->addConfig(['parameters' => $parameters]);
199-
$compiler->setDynamicParameterNames(array_keys($this->dynamicParameters));
204+
$compiler->setDynamicParameterNames(array_merge(
205+
array_keys($this->dynamicParameters),
206+
['baseUrl'],
207+
),);
200208

201209
$builder = $compiler->getContainerBuilder();
202210
$builder->addExcludedClasses($this->autowireExcludedClasses);

src/Boot/Parameters/BaseUrl.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace OriNette\DI\Boot\Parameters;
4+
5+
use Nette\Http\IRequest;
6+
use function rtrim;
7+
8+
/**
9+
* @internal
10+
*/
11+
final class BaseUrl
12+
{
13+
14+
private ?IRequest $request;
15+
16+
public function __construct(?IRequest $request = null)
17+
{
18+
$this->request = $request;
19+
}
20+
21+
public function get(): ?string
22+
{
23+
return $this->request === null
24+
? null
25+
: rtrim($this->request->getUrl()->getBaseUrl(), '/');
26+
}
27+
28+
}

src/Boot/Parameters/wiring.neon

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
services:
2+
orisai.di.boot.baseUrl: OriNette\DI\Boot\Parameters\BaseUrl

stubs/parameters.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ parameters:
1010
tempDir: %rootDir%/var/cache # Absolute path to temporary files
1111
vendorDir: %rootDir%/vendor # Absolute path to Composer libraries
1212
wwwDir: %rootDir%/public # Absolute path to public directory which shall be available through the webserver
13+
baseUrl: 'https://127.0.0.1' # Absolute URL to project root (without ending slash)
1314
debugMode: false # Is application in debug mode?
1415
productionMode: true # Opposite of debugMode
1516
consoleMode: false # Did request come from command line (CLI)?

tests/Unit/Boot/BaseConfiguratorTest.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public function testParametersMatch(): void
101101
self::assertSame($rootDir . '/var/cache', $parameters['tempDir']);
102102
self::assertSame($rootDir . '/vendor', $parameters['vendorDir']);
103103
self::assertSame($rootDir . '/public', $parameters['wwwDir']);
104+
self::assertNull($parameters['baseUrl']);
104105
self::assertTrue($parameters['debugMode']);
105106
self::assertFalse($parameters['productionMode']);
106107
self::assertTrue($parameters['consoleMode']);
@@ -112,8 +113,8 @@ public function testParametersMatch(): void
112113
self::assertArrayHasKey('className', $parameters['container']);
113114

114115
// 10 default + 1 dynamic (container) + 2 from test
115-
self::assertCount(11 + 1 + 2, $parameters);
116-
self::assertCount(11, $configurator->getDefaultParameters());
116+
self::assertCount(12 + 1 + 2, $parameters);
117+
self::assertCount(12, $configurator->getDefaultParameters());
117118
}
118119

119120
public function testParametersSpecificContainer(): void
@@ -343,4 +344,17 @@ public function testTracyOptional(): void
343344
);
344345
}
345346

347+
public function testBaseUrl(): void
348+
{
349+
$configurator = new ManualConfigurator($this->rootDir);
350+
$configurator->setForceReloadContainer();
351+
352+
$configurator->addConfig(__DIR__ . '/config/baseUrl.neon');
353+
354+
$container = $configurator->createContainer();
355+
$parameters = $container->getParameters();
356+
357+
self::assertSame('https://example.com', $parameters['baseUrl']);
358+
}
359+
346360
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Tests\OriNette\DI\Unit\Boot\Parameters;
4+
5+
use Generator;
6+
use Nette\Http\Request;
7+
use Nette\Http\UrlScript;
8+
use OriNette\DI\Boot\Parameters\BaseUrl;
9+
use PHPUnit\Framework\TestCase;
10+
11+
final class BaseUrlTest extends TestCase
12+
{
13+
14+
public function testNone(): void
15+
{
16+
$baseUrl = new BaseUrl();
17+
self::assertNull($baseUrl->get());
18+
}
19+
20+
/**
21+
* @dataProvider provide
22+
*/
23+
public function test(string $given, string $expected): void
24+
{
25+
$request = new Request(new UrlScript($given));
26+
$baseUrl = new BaseUrl($request);
27+
self::assertSame($expected, $baseUrl->get());
28+
}
29+
30+
public function provide(): Generator
31+
{
32+
yield ['https://example.com', 'https://example.com'];
33+
yield ['https://example.com/', 'https://example.com'];
34+
yield ['https://example.com:8000/path', 'https://example.com:8000'];
35+
}
36+
37+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
services:
2+
- Nette\Http\Request(
3+
Nette\Http\UrlScript('https://example.com/')
4+
)

0 commit comments

Comments
 (0)