diff options
author | msquare <msquare@notrademark.de> | 2018-08-06 12:30:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-06 12:30:30 +0200 |
commit | a3ce3ea23de2e38968ddc98baf330dfa1f544b1a (patch) | |
tree | 646a1dca1db5e801f70733ce6b30d8682241207f | |
parent | 9ca36bed3446cdd4060d7d6fa1025512d0922e0e (diff) | |
parent | 6962c2b790b5428699fe5897de840d41090fcd37 (diff) |
Merge pull request #443 from MyIgel/legacy-url-support
UrlGeneratorInterface and "Legacy URL" support
-rw-r--r-- | config/config.default.php | 3 | ||||
-rw-r--r-- | src/Routing/LegacyUrlGenerator.php | 25 | ||||
-rw-r--r-- | src/Routing/RoutingServiceProvider.php | 9 | ||||
-rw-r--r-- | src/Routing/UrlGenerator.php | 2 | ||||
-rw-r--r-- | src/Routing/UrlGeneratorInterface.php | 13 | ||||
-rw-r--r-- | src/helpers.php | 4 | ||||
-rw-r--r-- | tests/Unit/HelpersTest.php | 5 | ||||
-rw-r--r-- | tests/Unit/Routing/LegacyUrlGeneratorTest.php | 54 | ||||
-rw-r--r-- | tests/Unit/Routing/RoutingServiceProviderTest.php | 49 | ||||
-rw-r--r-- | tests/Unit/Routing/UrlGeneratorTest.php | 5 |
10 files changed, 154 insertions, 15 deletions
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 @@ +<?php + +namespace Engelsystem\Routing; + +class LegacyUrlGenerator extends UrlGenerator +{ + /** + * @param string $path + * @param array $parameters + * @return string + */ + public function to($path, $parameters = []) + { + $page = ltrim($path, '/'); + if (!empty($page)) { + $page = str_replace('-', '_', $page); + $parameters = array_merge(['p' => $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 @@ +<?php + +namespace Engelsystem\Routing; + +interface UrlGeneratorInterface +{ + /** + * @param string $path + * @param array $parameters + * @return string + */ + public function to($path, $parameters = []); +} diff --git a/src/helpers.php b/src/helpers.php index 5a48498a..1915eb86 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -5,7 +5,7 @@ use Engelsystem\Application; use Engelsystem\Config\Config; use Engelsystem\Http\Request; use Engelsystem\Renderer\Renderer; -use Engelsystem\Routing\UrlGenerator; +use Engelsystem\Routing\UrlGeneratorInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface; /** @@ -114,7 +114,7 @@ function session($key = null, $default = null) /** * @param string $path * @param array $parameters - * @return UrlGenerator|string + * @return UrlGeneratorInterface|string */ function url($path = null, $parameters = []) { diff --git a/tests/Unit/HelpersTest.php b/tests/Unit/HelpersTest.php index 43c29c84..fcb7231d 100644 --- a/tests/Unit/HelpersTest.php +++ b/tests/Unit/HelpersTest.php @@ -7,7 +7,7 @@ use Engelsystem\Config\Config; use Engelsystem\Container\Container; use Engelsystem\Http\Request; use Engelsystem\Renderer\Renderer; -use Engelsystem\Routing\UrlGenerator; +use Engelsystem\Routing\UrlGeneratorInterface; use PHPUnit\Framework\TestCase; use PHPUnit_Framework_MockObject_MockObject as MockObject; use Symfony\Component\HttpFoundation\Session\Session; @@ -171,8 +171,7 @@ class HelpersTest extends TestCase */ public function testUrl() { - $urlGeneratorMock = $this->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 @@ +<?php + +namespace Engelsystem\Test\Unit\Routing; + +use Engelsystem\Application; +use Engelsystem\Container\Container; +use Engelsystem\Http\Request; +use Engelsystem\Routing\LegacyUrlGenerator; +use Engelsystem\Routing\UrlGeneratorInterface; +use PHPUnit\Framework\TestCase; + +class LegacyUrlGeneratorTest extends TestCase +{ + public function provideLinksTo() + { + return [ + ['/', 'http://foo.bar/index.php', [], 'http://foo.bar/index.php'], + ['/foo-path', 'http://foo.bar/index.php/index.php', [], 'http://foo.bar/index.php?p=foo_path'], + ['/foo', 'http://foo.bar/index.php/index.php', [], 'http://foo.bar/index.php?p=foo'], + ['foo', 'http://foo.bar/index.php', ['test' => '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); } |