-
Notifications
You must be signed in to change notification settings - Fork 0
/
RouteConfigurator.php
87 lines (78 loc) · 2.08 KB
/
RouteConfigurator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
namespace SCC;
/**
* Создать/редактировать роут.
* TODO: Добавить возможность добавления бесконечных форков
* TODO: Добавить возможность удаления роутов
*/
class RouteConfigurator {
protected string $route_uri;
function __construct(string $route_uri) {
$this->route_uri = $route_uri;
}
/**
* Получить объект роута
*/
function getRoute() {
require_once(ROOT."/".ROOT_CORE."/Route.php");
return \SCC\Route::create($this->route_uri);
}
/**
* Существует ли роут
*
* @return boolean
*/
function isExists() {
return $this->createRoute() !== null;
}
/**
* Создать роут
* @param $controller - Файл на который будет ссылаться путь.
* @param $aliases - Динамеческие параметры в указанно uri.
*/
function create(string $controller, array $aliases = []) {
$uri = explode("/",$this->route_uri);
$fistAlias = array_shift($uri);
$keyLast = count($uri)-1;
if ($keyLast < 1) return;
if ($fistAlias === "") {
$state = \SCC\state("routing");
} else {
$state = \SCC\state("routing_".$fistAlias);
}
if ($uri[$keyLast] === "") {
unset($uri[$keyLast]);
$keyLast--;
}
$is_fork2 = null;
$is_fork = false;
foreach ($uri as $key => $value) {
$is_fork_child = in_array($value, $aliases);
$child = $state->createChild($value);
$needStateSave = false;
if ($is_fork_child) {
if ($is_fork && $is_fork2)
$state = $state->createChild($uri[$key-1]);
$state->set("fork.alias",$value);
$needStateSave = true;
}
if ($key === $keyLast) {
if ($is_fork_child) {
$state->set("fork.path",$controller);
$needStateSave = true;
} else {
$child->set("path",$controller);
$child->save();
}
}
if ($needStateSave)
$state->save();
if (!$is_fork_child || ($is_fork_child && !$is_fork)) {
$state = $child;
}
if ($key > 1)
$is_fork2 = $is_fork;
$is_fork = $is_fork_child;
}
}
}