nativegallery/app/Services/Router.php
2024-07-04 12:04:41 +03:00

195 lines
No EOL
6.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}