nativegallery/app/Services/Router.php

194 lines
6.2 KiB
PHP
Raw Normal View History

2024-07-04 12:04:41 +03:00
<?php
namespace App\Services;
use \App\Core\Page;
class Router
{
public static function get($route, $path_to_include)
{
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
self::route($route, $path_to_include);
}
}
public static function post($route, $path_to_include)
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
self::route($route, $path_to_include);
}
}
public static function put($route, $path_to_include)
{
if ($_SERVER['REQUEST_METHOD'] == 'PUT') {
self::route($route, $path_to_include);
}
}
public static function patch($route, $path_to_include)
{
if ($_SERVER['REQUEST_METHOD'] == 'PATCH') {
self::route($route, $path_to_include);
}
}
public static function delete($route, $path_to_include)
{
if ($_SERVER['REQUEST_METHOD'] == 'DELETE') {
self::route($route, $path_to_include);
}
}
public static function any($route, $path_to_include)
{
self::route($route, $path_to_include);
}
public static function route($route, $path_to_include)
{
$root = $_SERVER['DOCUMENT_ROOT'];
// Обработка случая, когда маршрут - 404
if ($route == "/404") {
self::includeControllerMethod($path_to_include);
exit();
}
// Получение URL-адреса запроса и разделение его на части
$request_url = strtok(filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL), '?');
$request_url_parts = explode('/', rtrim($request_url, '/'));
$route_parts = explode('/', $route);
array_shift($route_parts);
array_shift($request_url_parts);
// Обработка корневого маршрута
if ($route_parts[0] == '' && count($request_url_parts) == 0) {
self::includeControllerMethod($path_to_include);
$file_path = $root . '/app/Controllers/' . $controller . '.php';
$file_size = filesize($file_path);
header("Content-Length: $file_size");
exit();
}
// Проверка соответствия количества частей маршрута и запроса
if (count($route_parts) !== count($request_url_parts)) {
return;
}
// Обработка параметров маршрута
$parameters = [];
foreach ($route_parts as $index => $route_part) {
if (preg_match("/^[$]/", $route_part)) {
$route_part = ltrim($route_part, '$');
$parameters[] = $request_url_parts[$index];
$$route_part = $request_url_parts[$index];
global $$route_part;
} elseif ($route_part !== $request_url_parts[$index]) {
return;
}
}
// Включение контроллера и вызов метода
self::includeControllerMethod($path_to_include);
exit();
}
// Функция для включения контроллера и вызова метода
private static function includeControllerMethod($path_to_include)
{
list($controller, $method) = explode('@', $path_to_include);
$controller = '\App\Controllers\\' . $controller;
$objectController = new $controller;
$objectController->$method();
}
private static function out($text)
{
echo htmlspecialchars($text);
}
private static function set_csrf()
{
if (!isset($_SESSION["csrf"])) {
$_SESSION["csrf"] = bin2hex(random_bytes(50));
}
echo '<input type="hidden" name="csrf" value="' . $_SESSION["csrf"] . '">';
}
private static function is_csrf_valid()
{
if (!isset($_SESSION['csrf']) || !isset($_POST['csrf'])) {
return false;
}
if ($_SESSION['csrf'] != $_POST['csrf']) {
return false;
}
return true;
}
private static function notfound()
{
Page::set('Errors/404');
}
public static function redirect($page)
{
header("Location: {$page}");
}
public static function method()
{
return $_SERVER['REQUEST_METHOD'];
}
public static function ip()
{
$fields = array(
'HTTP_CF_CONNECTING_IP',
'HTTP_X_SUCURI_CLIENTIP',
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR',
// more custom fields
);
foreach ($fields as $ip_field) {
if (!empty($_SERVER[$ip_field])) {
return $_SERVER[$ip_field];
}
}
return null;
}
public static function checkCurl($url)
{
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';
$options = array(
CURLOPT_CUSTOMREQUEST => "GET", //set request type post or get
CURLOPT_POST => false, //set to GET
CURLOPT_USERAGENT => $user_agent, //set user agent
CURLOPT_COOKIE => "BIRUXSESS_=1;KANDLESERVICETOKEN__779hfh908BNol8FHn7d9MNFOL8fjND8D9MNfdo=BIRUXSERVICE__TOKENYY", //set cookie file
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_RETURNTRANSFER => 1
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $httpcode;
}
}