You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
2.0 KiB
PHP

<?php
namespace CubiStore\Web\Utils;
class RouteCompiler
{
private $target;
private $root;
private $keys;
public function __construct($target = __DIR__ . '/../../var/cache/routes.php')
{
$this->target = $target;
$this->root = Route::root();
$this->keys = [];
}
public function addRoutes(array $routes, ?Route $target = null)
{
if ($target === null) {
$target = $this->root;
}
foreach ($routes as $route => $details) {
if (is_array($details)) {
$routeObj = Route::group($target, $route);
$this->addRoutes($details, $routeObj);
}
if (!is_string($details)) {
continue;
}
$parts = explode(':', $details, 2);
$this->keys[$parts[0]] = true;
if ($route[0] !== '/') {
Route::call($target, $route, '', $details);
continue;
}
Route::call($target, 'GET', $route, $details);
}
}
public function writeCache()
{
$dirname = dirname($this->target);
if (!is_dir($dirname)) {
mkdir($dirname, 0777, true);
}
file_put_contents($this->target, $this->compile());
}
public function compile()
{
$keys = array_map(function ($item) {
return json_encode($item, JSON_UNESCAPED_SLASHES);
}, array_keys($this->keys));
$head = "<?php
namespace CubiStore\\Web\\Cache;
use CubiStore\\Web\\Utils\\ICompiledRoutes;
use Slim\\App;
use Slim\\Routing\\RouteCollectorProxy;
class CompiledRoutes implements ICompiledRoutes {
function configure(App \$app) {\n";
$tail = "
}
function getKeys(): array {
return [
" . implode(",\n" . str_repeat(' ', 12), $keys) . "
];
}
}
";
$configure = $this->root->compileRoute("\$app", 8);
return $head . $configure . $tail;
}
}