diff --git a/config/config.default.php b/config/config.default.php index ed40aaf9..c0b00715 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -43,6 +43,9 @@ return [ '1' => 'Engelsystem dark' ], + // Rewrite URLs with mod_rewrite + 'rewrite_urls' => true, + // Number of News shown on one site 'display_news' => 6, diff --git a/src/Routing/LegacyUrlGenerator.php b/src/Routing/LegacyUrlGenerator.php new file mode 100644 index 00000000..f17bdf88 --- /dev/null +++ b/src/Routing/LegacyUrlGenerator.php @@ -0,0 +1,25 @@ + $page], $parameters); + } + + $uri = parent::to('index.php', $parameters); + $uri = preg_replace('~(/index\.php)+~', '/index.php', $uri); + + return $uri; + } +} diff --git a/src/Routing/RoutingServiceProvider.php b/src/Routing/RoutingServiceProvider.php index b7db1383..021840c3 100644 --- a/src/Routing/RoutingServiceProvider.php +++ b/src/Routing/RoutingServiceProvider.php @@ -8,7 +8,14 @@ class RoutingServiceProvider extends ServiceProvider { public function register() { - $urlGenerator = $this->app->make(UrlGenerator::class); + $config = $this->app->get('config'); + $class = UrlGenerator::class; + if (!$config->get('rewrite_urls', true)) { + $class = LegacyUrlGenerator::class; + } + + $urlGenerator = $this->app->make($class); $this->app->instance('routing.urlGenerator', $urlGenerator); + $this->app->bind(UrlGeneratorInterface::class, 'routing.urlGenerator'); } } diff --git a/src/Routing/UrlGenerator.php b/src/Routing/UrlGenerator.php index 6df52425..8dd52271 100644 --- a/src/Routing/UrlGenerator.php +++ b/src/Routing/UrlGenerator.php @@ -2,7 +2,7 @@ namespace Engelsystem\Routing; -class UrlGenerator +class UrlGenerator implements UrlGeneratorInterface { /** * @param string $path diff --git a/src/Routing/UrlGeneratorInterface.php b/src/Routing/UrlGeneratorInterface.php new file mode 100644 index 00000000..d97da30d --- /dev/null +++ b/src/Routing/UrlGeneratorInterface.php @@ -0,0 +1,13 @@ +getMockBuilder(UrlGenerator::class) - ->getMock(); + $urlGeneratorMock = $this->getMockForAbstractClass(UrlGeneratorInterface::class); $this->getAppMock('routing.urlGenerator', $urlGeneratorMock); $this->assertEquals($urlGeneratorMock, url()); diff --git a/tests/Unit/Routing/LegacyUrlGeneratorTest.php b/tests/Unit/Routing/LegacyUrlGeneratorTest.php new file mode 100644 index 00000000..63e1a3eb --- /dev/null +++ b/tests/Unit/Routing/LegacyUrlGeneratorTest.php @@ -0,0 +1,54 @@ + 'abc'], 'http://foo.bar/index.php?p=foo&test=abc'], + ]; + } + + /** + * @dataProvider provideLinksTo + * @covers \Engelsystem\Routing\LegacyUrlGenerator::to + * + * @param string $urlToPath + * @param string $willReturn + * @param string[] $arguments + * @param string $expectedUrl + */ + public function testTo($urlToPath, $willReturn, $arguments, $expectedUrl) + { + $app = new Container(); + Application::setInstance($app); + + $request = $this->getMockBuilder(Request::class) + ->getMock(); + + $request->expects($this->once()) + ->method('getUriForPath') + ->with('/index.php') + ->willReturn($willReturn); + + $app->instance('request', $request); + + $urlGenerator = new LegacyUrlGenerator(); + $this->assertInstanceOf(UrlGeneratorInterface::class, $urlGenerator); + + $url = $urlGenerator->to($urlToPath, $arguments); + $this->assertEquals($expectedUrl, $url); + } +} diff --git a/tests/Unit/Routing/RoutingServiceProviderTest.php b/tests/Unit/Routing/RoutingServiceProviderTest.php index dd9441eb..ce3d7290 100644 --- a/tests/Unit/Routing/RoutingServiceProviderTest.php +++ b/tests/Unit/Routing/RoutingServiceProviderTest.php @@ -2,10 +2,13 @@ namespace Engelsystem\Test\Unit\Routing; +use Engelsystem\Config\Config; +use Engelsystem\Routing\LegacyUrlGenerator; use Engelsystem\Routing\RoutingServiceProvider; use Engelsystem\Routing\UrlGenerator; +use Engelsystem\Routing\UrlGeneratorInterface; use Engelsystem\Test\Unit\ServiceProviderTest; -use PHPUnit_Framework_MockObject_MockObject; +use PHPUnit_Framework_MockObject_MockObject as MockObject; class RoutingServiceProviderTest extends ServiceProviderTest { @@ -14,16 +17,48 @@ class RoutingServiceProviderTest extends ServiceProviderTest */ public function testRegister() { - /** @var PHPUnit_Framework_MockObject_MockObject|UrlGenerator $urlGenerator */ - $urlGenerator = $this->getMockBuilder(UrlGenerator::class) - ->getMock(); + $app = $this->getApp(['make', 'instance', 'bind', 'get']); + /** @var MockObject|Config $config */ + $config = $this->getMockBuilder(Config::class)->getMock(); + /** @var MockObject|UrlGeneratorInterface $urlGenerator */ + $urlGenerator = $this->getMockForAbstractClass(UrlGeneratorInterface::class); + /** @var MockObject|UrlGeneratorInterface $legacyUrlGenerator */ + $legacyUrlGenerator = $this->getMockForAbstractClass(UrlGeneratorInterface::class); - $app = $this->getApp(); + $config->expects($this->atLeastOnce()) + ->method('get') + ->with('rewrite_urls') + ->willReturnOnConsecutiveCalls( + true, + false + ); - $this->setExpects($app, 'make', [UrlGenerator::class], $urlGenerator); - $this->setExpects($app, 'instance', ['routing.urlGenerator', $urlGenerator]); + $this->setExpects($app, 'get', ['config'], $config, $this->atLeastOnce()); + + $app->expects($this->atLeastOnce()) + ->method('make') + ->withConsecutive( + [UrlGenerator::class], + [LegacyUrlGenerator::class] + ) + ->willReturnOnConsecutiveCalls( + $urlGenerator, + $legacyUrlGenerator + ); + $app->expects($this->atLeastOnce()) + ->method('instance') + ->withConsecutive( + ['routing.urlGenerator', $urlGenerator], + ['routing.urlGenerator', $legacyUrlGenerator] + ); + $this->setExpects( + $app, 'bind', + [UrlGeneratorInterface::class, 'routing.urlGenerator'], null, + $this->atLeastOnce() + ); $serviceProvider = new RoutingServiceProvider($app); $serviceProvider->register(); + $serviceProvider->register(); } } diff --git a/tests/Unit/Routing/UrlGeneratorTest.php b/tests/Unit/Routing/UrlGeneratorTest.php index 6da59a4f..8fe0d65f 100644 --- a/tests/Unit/Routing/UrlGeneratorTest.php +++ b/tests/Unit/Routing/UrlGeneratorTest.php @@ -6,6 +6,7 @@ use Engelsystem\Application; use Engelsystem\Container\Container; use Engelsystem\Http\Request; use Engelsystem\Routing\UrlGenerator; +use Engelsystem\Routing\UrlGeneratorInterface; use PHPUnit\Framework\TestCase; class UrlGeneratorTest extends TestCase @@ -32,7 +33,6 @@ class UrlGeneratorTest extends TestCase public function testTo($urlToPath, $path, $willReturn, $arguments, $expectedUrl) { $app = new Container(); - $urlGenerator = new UrlGenerator(); Application::setInstance($app); $request = $this->getMockBuilder(Request::class) @@ -45,6 +45,9 @@ class UrlGeneratorTest extends TestCase $app->instance('request', $request); + $urlGenerator = new UrlGenerator(); + $this->assertInstanceOf(UrlGeneratorInterface::class, $urlGenerator); + $url = $urlGenerator->to($urlToPath, $arguments); $this->assertEquals($expectedUrl, $url); }