Skip to content

Commit

Permalink
RoutingExtension: added support for custom single-route classes.
Browse files Browse the repository at this point in the history
  • Loading branch information
vlastavesely committed Oct 19, 2016
1 parent f0ae586 commit 6b79913
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 33 deletions.
20 changes: 16 additions & 4 deletions src/Bridges/ApplicationDI/RoutingExtension.php
Expand Up @@ -19,6 +19,7 @@ class RoutingExtension extends Nette\DI\CompilerExtension
public $defaults = [
'debugger' => NULL,
'routes' => [], // of [mask => action]
'routeClass' => NULL,
'cache' => FALSE,
];

Expand All @@ -42,10 +43,6 @@ public function loadConfiguration()
->setClass(Nette\Application\IRouter::class)
->setFactory(Nette\Application\Routers\RouteList::class);

foreach ($config['routes'] as $mask => $action) {
$router->addSetup('$service[] = new Nette\Application\Routers\Route(?, ?);', [$mask, $action]);
}

if ($this->name === 'routing') {
$builder->addAlias('router', $this->prefix('router'));
}
Expand All @@ -55,6 +52,21 @@ public function loadConfiguration()
public function beforeCompile()
{
$builder = $this->getContainerBuilder();
$router = $builder->getDefinition($this->prefix('router'));

if ($this->config['routeClass']) {
$class = $this->config['routeClass'];
} else {
$namespace = Nette\PhpGenerator\Helpers::extractNamespace($router->getFactory()->getEntity());
$class = $namespace . '\Route';
if (!class_exists($class)) {
$class = 'Nette\Application\Routers\Route';
}
}

foreach ($this->config['routes'] as $mask => $action) {
$router->addSetup('$service[] = new ' . $class . '(?, ?)', [$mask, $action]);
}

if ($this->debugMode && $this->config['debugger'] && $application = $builder->getByType(Nette\Application\Application::class)) {
$builder->getDefinition($application)->addSetup('@Tracy\Bar::addPanel', [
Expand Down
128 changes: 99 additions & 29 deletions tests/Bridges.DI/RoutingExtension.basic.phpt
Expand Up @@ -4,32 +4,102 @@
* Test: RoutingExtension.
*/

use Nette\DI;
use Nette\Bridges\ApplicationDI\RoutingExtension;
use Tester\Assert;


require __DIR__ . '/../bootstrap.php';


test(function () {
$loader = new DI\Config\Loader;
$config = $loader->load(Tester\FileMock::create('
routing:
routes:
index.php: Homepage:default
item/<id>: Homepage:detail
', 'neon'));

$compiler = new DI\Compiler;
$compiler->addExtension('routing', new RoutingExtension(FALSE));
$code = $compiler->addConfig($config)->compile();
eval($code);

$container = new Container;
$router = $container->getService('router');
Assert::type(Nette\Application\Routers\RouteList::class, $router);
Assert::count(2, $router);
Assert::same('index.php', $router[0]->getMask());
Assert::same('item/<id>', $router[1]->getMask());
});
namespace {

require __DIR__ . '/../bootstrap.php';

}


namespace TestNamespace {

use Nette\Application\Routers;

class RouteList extends Routers\RouteList
{}


class Route extends Routers\Route
{}

}


namespace {

use Nette\DI;
use Nette\Bridges\ApplicationDI\RoutingExtension;
use Tester\Assert;


test(function () {
$loader = new DI\Config\Loader;
$config = $loader->load(Tester\FileMock::create('
routing:
routes:
index.php: Homepage:default
item/<id>: Homepage:detail
', 'neon'));

$compiler = new DI\Compiler;
$compiler->addExtension('routing', new RoutingExtension(FALSE));
$code = $compiler->addConfig($config)->setClassName('Container_basic')->compile();
eval($code);

$container = new Container_basic;
$router = $container->getService('router');
Assert::type(Nette\Application\Routers\RouteList::class, $router);
Assert::count(2, $router);
Assert::same('index.php', $router[0]->getMask());
Assert::same('item/<id>', $router[1]->getMask());
Assert::type(Nette\Application\Routers\Route::class, $router[0]);
});


test(function () {
$loader = new DI\Config\Loader;
$config = $loader->load(Tester\FileMock::create('
routing:
routeClass:
TestNamespace\Route
routes:
item/<id>: Homepage:detail
', 'neon'));

$compiler = new DI\Compiler;
$compiler->addExtension('routing', new RoutingExtension(FALSE));
$code = $compiler->addConfig($config)->setClassName('Container_customRoute')->compile();
eval($code);

$container = new Container_customRoute;
$router = $container->getService('router');

Assert::type(Nette\Application\Routers\RouteList::class, $router);
Assert::type(TestNamespace\Route::class, $router[0]);
});


test(function () {
$loader = new DI\Config\Loader;
$config = $loader->load(Tester\FileMock::create('
services:
router:
class: TestNamespace\RouteList
routing:
routes:
item/<id>: Homepage:detail
', 'neon'));

$compiler = new DI\Compiler;
$compiler->addExtension('routing', new RoutingExtension(FALSE));
$code = $compiler->addConfig($config)->setClassName('Container_customRouteList')->compile();
eval($code);

$container = new Container_customRouteList;
$router = $container->getService('router');

Assert::type(TestNamespace\RouteList::class, $router);
Assert::type(TestNamespace\Route::class, $router[0]);
});

}

0 comments on commit 6b79913

Please sign in to comment.