Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move public functions #213

Closed
wants to merge 11 commits into from
79 changes: 79 additions & 0 deletions src/Utils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php
declare(strict_types=1);

namespace FastRoute;

use LogicException;
use RuntimeException;
use function assert;
use function file_exists;
use function file_put_contents;
use function is_array;
use function var_export;

class Utils
{
/**
* @param array<string, string> $options
*/
public static function simpleDispatcher(callable $routeDefinitionCallback, array $options = []): Dispatcher
{
$options += [
'routeParser' => RouteParser\Std::class,
'dataGenerator' => DataGenerator\GroupCountBased::class,
'dispatcher' => Dispatcher\GroupCountBased::class,
'routeCollector' => RouteCollector::class,
];

$routeCollector = new $options['routeCollector'](
new $options['routeParser'](), new $options['dataGenerator']()
);
assert($routeCollector instanceof RouteCollector);
$routeDefinitionCallback($routeCollector);

return new $options['dispatcher']($routeCollector->getData());
}

/**
* @param array<string, string> $options
*/
public static function cachedDispatcher(callable $routeDefinitionCallback, array $options = []): Dispatcher
{
$options += [
'routeParser' => RouteParser\Std::class,
'dataGenerator' => DataGenerator\GroupCountBased::class,
'dispatcher' => Dispatcher\GroupCountBased::class,
'routeCollector' => RouteCollector::class,
'cacheDisabled' => false,
];

if (! isset($options['cacheFile'])) {
throw new LogicException('Must specify "cacheFile" option');
}

if (! $options['cacheDisabled'] && file_exists($options['cacheFile'])) {
$dispatchData = require $options['cacheFile'];
if (! is_array($dispatchData)) {
throw new RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"');
}

return new $options['dispatcher']($dispatchData);
}

$routeCollector = new $options['routeCollector'](
new $options['routeParser'](), new $options['dataGenerator']()
);
assert($routeCollector instanceof RouteCollector);
$routeDefinitionCallback($routeCollector);

$dispatchData = $routeCollector->getData();
if (! $options['cacheDisabled']) {
file_put_contents(
$options['cacheFile'],
'<?php return ' . var_export($dispatchData, true) . ';'
);
}

return new $options['dispatcher']($dispatchData);
}
}
59 changes: 2 additions & 57 deletions src/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,77 +3,22 @@

namespace FastRoute;

use LogicException;
use RuntimeException;
use function assert;
use function file_exists;
use function file_put_contents;
use function function_exists;
use function is_array;
use function var_export;

if (! function_exists('FastRoute\simpleDispatcher')) {
/**
* @param array<string, string> $options
*/
function simpleDispatcher(callable $routeDefinitionCallback, array $options = []): Dispatcher
{
$options += [
'routeParser' => RouteParser\Std::class,
'dataGenerator' => DataGenerator\GroupCountBased::class,
'dispatcher' => Dispatcher\GroupCountBased::class,
'routeCollector' => RouteCollector::class,
];

$routeCollector = new $options['routeCollector'](
new $options['routeParser'](), new $options['dataGenerator']()
);
assert($routeCollector instanceof RouteCollector);
$routeDefinitionCallback($routeCollector);

return new $options['dispatcher']($routeCollector->getData());
return Utils::simpleDispatcher($routeDefinitionCallback, $options);
}

/**
* @param array<string, string> $options
*/
function cachedDispatcher(callable $routeDefinitionCallback, array $options = []): Dispatcher
{
$options += [
'routeParser' => RouteParser\Std::class,
'dataGenerator' => DataGenerator\GroupCountBased::class,
'dispatcher' => Dispatcher\GroupCountBased::class,
'routeCollector' => RouteCollector::class,
'cacheDisabled' => false,
];

if (! isset($options['cacheFile'])) {
throw new LogicException('Must specify "cacheFile" option');
}

if (! $options['cacheDisabled'] && file_exists($options['cacheFile'])) {
$dispatchData = require $options['cacheFile'];
if (! is_array($dispatchData)) {
throw new RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"');
}

return new $options['dispatcher']($dispatchData);
}

$routeCollector = new $options['routeCollector'](
new $options['routeParser'](), new $options['dataGenerator']()
);
assert($routeCollector instanceof RouteCollector);
$routeDefinitionCallback($routeCollector);

$dispatchData = $routeCollector->getData();
if (! $options['cacheDisabled']) {
file_put_contents(
$options['cacheFile'],
'<?php return ' . var_export($dispatchData, true) . ';'
);
}

return new $options['dispatcher']($dispatchData);
return Utils::cachedDispatcher($routeDefinitionCallback, $options);
}
}