PageRenderTime 50ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/core/Router/Routes.php

https://gitlab.com/fiesta-framework/Documentation
PHP | 573 lines | 539 code | 18 blank | 16 comment | 55 complexity | f43d1ae302934a2cb2a252d44e42b0bb MD5 | raw file
  1. <?php
  2. namespace Fiesta\Router;
  3. /**
  4. * Routes 2
  5. */
  6. class Routes
  7. {
  8. private static $requests=array();
  9. private static $filters=array();
  10. private static $current=null;
  11. public static function get($uri,$callback,$subdomains=null)
  12. {
  13. $domains = null;
  14. if(!is_null($subdomains)) $domains = self::extractSubdomains($subdomains);
  15. if(is_callable($callback)) self::addCallable($uri,$callback,"get",$domains);
  16. else if(is_array($callback)) self::addFiltred($uri,$callback,"get",$domains);
  17. }
  18. public static function post($uri,$callback)
  19. {
  20. if(is_callable($callback)) self::addCallable($uri,$callback,"post");
  21. else if(is_array($callback)) self::addFiltred($uri,$callback,"post");
  22. }
  23. protected static function extractSubdomains($subdomains)
  24. {
  25. $spliter=",";
  26. return explode($spliter, $subdomains);
  27. }
  28. protected static function convert(&$url)
  29. {
  30. if($url=="/")
  31. {
  32. $value="project_home";
  33. $url="";
  34. }
  35. else
  36. {
  37. $value=$url;
  38. $url="/".$url;
  39. }
  40. return $value;
  41. }
  42. protected static function convertParams($url)
  43. {
  44. $url2="";
  45. $inner=false;
  46. for ($i=0; $i < strlen($url); $i++)
  47. {
  48. if(!$inner)
  49. {
  50. if($url[$i]!="{") $url2.=$url[$i];
  51. else
  52. {
  53. $url2.="{";
  54. $inner=true;
  55. }
  56. }
  57. else
  58. {
  59. if($url[$i]=="}")
  60. {
  61. $url2.="}";
  62. $inner=false;
  63. }
  64. }
  65. }
  66. return $url2;
  67. }
  68. protected static function addCallable($url,$callback,$methode,$subdomain=null)
  69. {
  70. $name=self::convert($url);
  71. $r = array(
  72. 'name' => $name ,
  73. 'url' => $url ,
  74. 'callback' => $callback,
  75. 'methode' => $methode,
  76. "filtre" => null,
  77. "subdomain" => $subdomain,
  78. 'controller' => null
  79. );
  80. //
  81. self::$requests[]=$r;
  82. $r = array(
  83. 'name' => "$name"."/" ,
  84. 'url' => $url."/" ,
  85. 'callback' => $callback,
  86. 'methode' => $methode,
  87. "filtre" => null,
  88. "subdomain" => $subdomain,
  89. 'controller' => null
  90. );
  91. //
  92. self::$requests[]=$r;
  93. }
  94. protected static function addFiltred($uri,$callback,$methode,$subdomain=null)
  95. {
  96. $name=self::convert($url);
  97. $r = array(
  98. 'name' => $name ,
  99. 'url' => $url ,
  100. 'callback' => $callback[1],
  101. 'methode' => $methode,
  102. "filtre" => $callback[0],
  103. "subdomain" => $subdomain,
  104. 'controller' => null
  105. );
  106. //
  107. self::$requests[]=$r;
  108. $r = array(
  109. 'name' => $name."/" ,
  110. 'url' => $url."/" ,
  111. 'callback' => $callback[1],
  112. 'methode' => $methode,
  113. "filtre" => $callback[0],
  114. "subdomain" => $subdomain,
  115. 'controller' => null
  116. );
  117. //
  118. self::$requests[]=$r;
  119. }
  120. protected static function newFilterString($route)
  121. {
  122. if(!empty($route["filtre"]))
  123. {
  124. $call=self::$_filters[self::$_request[$key]];
  125. $ok=call_user_func($call);
  126. if(!$ok) { $falseok=self::$_request[$key]; }
  127. }
  128. }
  129. protected static function getSubDomain()
  130. {
  131. $domain=$_SERVER['SERVER_NAME'];
  132. }
  133. protected static function getDomain()
  134. {
  135. $domain=$_SERVER['SERVER_NAME'];
  136. return $domain;
  137. }
  138. protected static function selectMethode($request,$params)
  139. {
  140. var_dump($request["subdomain"]);
  141. //
  142. if($request["methode"]=="post" && Res::isPost())
  143. {
  144. $ok=self::exec($params,$request);
  145. break;
  146. }
  147. else if($request["methode"]=="post" && !Res::isPost())
  148. {
  149. $ok=0;
  150. }
  151. else if($request["methode"]=="get")
  152. {
  153. $ok=self::exec($params,$request);
  154. break;
  155. }
  156. else if($request["methode"]=="resource")
  157. {
  158. $ok=self::exec($params,$request);
  159. break;
  160. }
  161. else if($request["methode"]=="object")
  162. {
  163. $ok=self::exec($params,$request);
  164. //var_dump($request);
  165. break;
  166. }
  167. return $ok;
  168. }
  169. public static function run()
  170. {
  171. $currentUrl=self::CheckUrl();
  172. //
  173. if(self::CheckMaintenance(self::MaintenanceUrl()))
  174. {
  175. self::ReplaceParams();
  176. self::Replace();
  177. //
  178. $ok=false;
  179. //
  180. foreach (self::$requests as $value) {
  181. $requestsUrl=$value["url"];
  182. //var_dump($value);
  183. //
  184. if(preg_match("#^$requestsUrl$#", $currentUrl,$params))
  185. {
  186. if(!is_null($value["subdomain"]))
  187. {
  188. if(\Table::contains($value["subdomain"],self::getDomain()))
  189. {
  190. if($value["methode"]=="post" && \Res::isPost())
  191. {
  192. $ok=self::exec($params,$value);
  193. break;
  194. }
  195. else if($value["methode"]=="post" && !\Res::isPost())
  196. {
  197. $ok=0;
  198. }
  199. else if($value["methode"]=="get")
  200. {
  201. $ok=self::exec($params,$value);
  202. break;
  203. }
  204. else if($value["methode"]=="resource")
  205. {
  206. $ok=self::exec($params,$value);
  207. break;
  208. }
  209. else if($value["methode"]=="object")
  210. {
  211. $ok=self::exec($params,$value);
  212. //var_dump($value);
  213. break;
  214. }
  215. }
  216. else $ok=0;
  217. }
  218. else
  219. {
  220. if($value["methode"]=="post" && \Res::isPost())
  221. {
  222. $ok=self::exec($params,$value);
  223. break;
  224. }
  225. else if($value["methode"]=="post" && !\Res::isPost())
  226. {
  227. $ok=0;
  228. }
  229. else if($value["methode"]=="get")
  230. {
  231. $ok=self::exec($params,$value);
  232. break;
  233. }
  234. else if($value["methode"]=="resource")
  235. {
  236. $ok=self::exec($params,$value);
  237. break;
  238. }
  239. else if($value["methode"]=="object")
  240. {
  241. $ok=self::exec($params,$value);
  242. //var_dump($value);
  243. break;
  244. }
  245. }
  246. }
  247. }
  248. if($ok==0)
  249. {
  250. if(\Config::get('app.unrouted'))
  251. throw new RouteNotFoundException("There is no route call's ".$currentUrl." in your route file");
  252. else \Errors::r_404();
  253. }
  254. }
  255. else self::showMaintenance();
  256. }
  257. protected static function exec($params,&$one)
  258. {
  259. array_shift($params);
  260. //
  261. self::callBefore();
  262. //
  263. $ok=true;
  264. $falseok=null;
  265. $oks=array();
  266. //
  267. $filtre=$one["filtre"];
  268. if(is_string($filtre))
  269. {
  270. if(!empty($filtre))
  271. {
  272. self::callFilter($filtre,$ok,$falseok);
  273. }
  274. }
  275. // self::$_request[$key] => $filtre
  276. else if(is_array($filtre))
  277. {
  278. if(!empty($filtre))
  279. {
  280. self::callFilters($filtre,$ok,$falseok);
  281. }
  282. }
  283. // run the route callback
  284. if($ok) { self::runRoute($one,$params); }
  285. //if the filter is false
  286. else { $ok=self::falseFilter($falseok); }
  287. //
  288. self::callAfter();
  289. $ok=1;
  290. return $ok;
  291. }
  292. protected static function callBefore()
  293. {
  294. call_user_func(\App::$Callbacks['before']);
  295. }
  296. protected static function callAfter()
  297. {
  298. call_user_func(\App::$Callbacks['after']);
  299. }
  300. protected static function SplitSlash($link)
  301. {
  302. $one="";
  303. $links=$_SERVER['DOCUMENT_ROOT'];
  304. $array=explode('/', $link);
  305. foreach ($array as $value)
  306. {
  307. $links.="/".$value;
  308. if (!is_dir($links)) $one.=$value."/";
  309. }
  310. return $one;
  311. }
  312. protected static function MaintenanceUrl()
  313. {
  314. //$url=self::SplitSlash($_SERVER["REQUEST_URI"]);
  315. $url=isset($_GET['url'])?$_GET['url']:"/";
  316. return $url;
  317. //return '/'.$url;
  318. }
  319. protected static function CheckUrl()
  320. {
  321. //$url=self::SplitSlash($_SERVER["REQUEST_URI"]);
  322. $url=isset($_GET['url'])?'/'.$_GET['url']:"/";
  323. return $url;
  324. //return '/'.$url;
  325. }
  326. protected static function CheckMaintenance($url)
  327. {
  328. if(!\Config::get("maintenance.activate") || in_array($url, \Config::get("maintenance.outRoutes")))
  329. return true;
  330. else return false;
  331. }
  332. protected static function Replace()
  333. {
  334. for ($i=0; $i < count(self::$requests); $i++)
  335. if (strpos(self::$requests[$i]['url'],'{}') !== false)
  336. self::$requests[$i]['url']=str_replace('{}', '(.*)?', self::$requests[$i]['url']);
  337. }
  338. protected static function ReplaceParams()
  339. {
  340. for ($i=0; $i < count(self::$requests); $i++)
  341. self::$requests[$i]['url']=self::convertParams(self::$requests[$i]['url']);
  342. //if (strpos(self::$requests[$i]['url'],'{}') !== false)
  343. // self::$requests[$i]['url']=str_replace('{}', '(.*)?', self::$requests[$i]['url']);
  344. }
  345. protected static function addFilter($name,$callback,$falsecall=null)
  346. {
  347. $r = array(
  348. 'name' => $name,
  349. 'callback' => $callback,
  350. 'falsecall' => $falsecall
  351. );
  352. self::$filters[$name]=$r;
  353. //if(!is_null($falsecall)) self::$_falsecall[$filter]=$falsecall;
  354. }
  355. public static function filter($name,$callback,$falsecall=null)
  356. {
  357. self::addFilter($name,$callback,$falsecall);
  358. }
  359. protected static function getFilterCallback($name)
  360. {
  361. return self::$filters[$name];
  362. }
  363. protected static function callFilter($filtre,&$ok,&$falseok)
  364. {
  365. $call=self::$filters[$filtre];
  366. $ok=call_user_func($call['callback']);
  367. if(!$ok) { $falseok=$filtre; }
  368. }
  369. protected static function callFilters($filtre,&$ok,&$falseok)
  370. {
  371. foreach ($filtre as $key => $value) {
  372. $call=self::$filters[$value];
  373. $ok=call_user_func($call['callback']);
  374. if(!$ok) { $falseok=$value; break; }
  375. }
  376. }
  377. protected static function runRoute($request,$params)
  378. {
  379. self::$current=$request["name"];
  380. return call_user_func_array($request["callback"], $params);
  381. }
  382. protected static function falseFilter($key)
  383. {
  384. $call=self::$filters[$key]['falsecall'];
  385. if(isset($call) && !empty($call))
  386. {
  387. return call_user_func($call);
  388. }
  389. }
  390. protected static function showMaintenance()
  391. {
  392. if(\Config::get("maintenance.maintenanceEvent")=="string") echo \Config::get("maintenance.maintenanceResponse");
  393. else if(\Config::get("maintenance.maintenanceEvent")=="link") \Url::redirect(\Config::get("maintenance.maintenanceResponse"));
  394. }
  395. public static function resource($uri,$controller,$data=null)
  396. {
  397. $only=(isset($data['only']) && !empty($data['only']))?$data['only']:null;
  398. $except=(isset($data['except']) && !empty($data['except']))?$data['except']:null;
  399. $names=(isset($data['names']) && !empty($data['names']))?$data['names']:null;
  400. //
  401. $routes=self::diffResource($only,$except);
  402. //
  403. $index=isset($names['index'])?(!empty($names['index'])?$names['index']:"index"):"index";
  404. $show=isset($names['show'])?(!empty($names['show'])?$names['show']:"show"):"show";
  405. $add=isset($names['add'])?(!empty($names['add'])?$names['add']:"add"):"add";
  406. $insert=isset($names['insert'])?(!empty($names['insert'])?$names['insert']:"insert"):"insert";
  407. $edit=isset($names['edit'])?(!empty($names['edit'])?$names['edit']:"edit"):"edit";
  408. $update=isset($names['update'])?(!empty($names['update'])?$names['update']:"update"):"update";
  409. $delete=isset($names['delete'])?(!empty($names['delete'])?$names['delete']:"delete"):"delete";
  410. //
  411. if(\Table::contains($routes,"index"))
  412. {
  413. self::addController($uri."", $controller,"index");
  414. self::addController($uri."/", $controller,"index");
  415. self::addController($uri."/".$index."", $controller,"index");
  416. self::addController($uri."/".$index."/", $controller,"index");
  417. }
  418. //
  419. if(\Table::contains($routes,"show"))
  420. {
  421. self::addController($uri."/$show/{}", $controller,"show");
  422. self::addController($uri."/$show/{}/", $controller,"show");
  423. }
  424. //
  425. if(\Table::contains($routes,"add"))
  426. {
  427. self::addController($uri."/$add", $controller,"add");
  428. self::addController($uri."/$add/", $controller,"add");
  429. }
  430. //
  431. if(\Table::contains($routes,"insert"))
  432. {
  433. self::addController($uri."/$insert", $controller,"insert");
  434. self::addController($uri."/$insert/", $controller,"insert");
  435. }
  436. //
  437. if(\Table::contains($routes,"edit"))
  438. {
  439. self::addController($uri."/$edit/{}", $controller,"edit");
  440. self::addController($uri."/$edit/{}/", $controller,"edit");
  441. }
  442. //
  443. if(\Table::contains($routes,"update"))
  444. {
  445. self::addController($uri."/$update", $controller,"update");
  446. self::addController($uri."/$update/", $controller,"update");
  447. self::addController($uri."/$update/{}", $controller,"update",true);
  448. self::addController($uri."/$update/{}/", $controller,"update",true);
  449. }
  450. //
  451. if(\Table::contains($routes,"delete"))
  452. {
  453. self::addController($uri."/$delete/{}", $controller,"delete");
  454. self::addController($uri."/$delete/{}/", $controller,"delete");
  455. }
  456. }
  457. protected static function addController($url,$controller,$methode,$params=false)
  458. {
  459. if($methode=="show" || $methode=="edit" || $methode=="delete")
  460. $callback=function($id) use ($controller,$methode){ $controller::$methode($id); };
  461. else if($methode=="update")
  462. {
  463. if($params) $callback=function($id) use ($controller,$methode){ $controller::$methode($id); };
  464. else $callback=function() use ($controller,$methode){ $controller::$methode(); };
  465. }
  466. else
  467. $callback=function() use ($controller,$methode){ $controller::$methode(); };
  468. $name=self::convert($url);
  469. $r = array(
  470. 'name' => $name ,
  471. 'url' => $url ,
  472. 'callback' => $callback,
  473. 'methode' => "resource",
  474. "filtre" => null,
  475. 'controller' => $controller
  476. );
  477. //
  478. self::$requests[]=$r;
  479. $r = array(
  480. 'name' => "$name"."/" ,
  481. 'url' => $url."/" ,
  482. 'callback' => $callback,
  483. 'methode' => "resource",
  484. "filtre" => null,
  485. 'controller' => $controller
  486. );
  487. self::$requests[]=$r;
  488. //
  489. }
  490. protected static function diffResource($only,$except)
  491. {
  492. $all = array('index','show','add','insert','edit','update','delete');
  493. //
  494. if(isset($except))
  495. {
  496. $i=0;
  497. foreach ($all as $value)
  498. {
  499. if(\Table::contains($except,$value)) unset($all[$i]);
  500. $i++;
  501. }
  502. }
  503. //
  504. if(isset($only))
  505. {
  506. foreach ($all as $key =>$value)
  507. {
  508. $ext=false;
  509. foreach ($only as $value2) {
  510. if($value==$value2) { $ext=true; break;}
  511. }
  512. if(!$ext) unset($all[$key]);
  513. }
  514. }
  515. return $all;
  516. }
  517. public static function current()
  518. {
  519. return self::$current;
  520. }
  521. }
  522. Routes::get(\Config::get('panel.route'),function()
  523. {
  524. include \Config::get('panel.folder').'/home.php';
  525. });