Файл: Neiron/Kernel/Request.php
Строк: 173
<?php
/**
 * PHP 5x framework с открытым иходным кодом
 */
namespace NeironKernel;
use NeironAPIKernelRequestInterface;
use NeironAPIKernelDIContainerInterface;
use NeironAPIKernelRequestControllerResolverInterface;
/**
 * Обработчик запросов к серверу
 * @author KpuTuK
 * @version 1.0.0
 * @package Neiron framework
 * @category Kernel
 * @link
 */
class Request implements RequestInterface
{
    /**
     * @var NeironAPIKernelRequestControllerResolverInterface
     */
    private $resolver;
    /**
     * Обьект класса для работы с cookie
     * @var NeironAPIKernelCookieInterface
     */
    public $cookies;
    /**
     * Обьект Dependency injection контейнера
     * @var NeironAPIKernelDIContainerInteface
     */
    private $container;
    private $globals = array();
    private $uri = null;
    /**
     * Конструктор класса
     * @param NeironAPIKernelDIContainerInterface $container
     */
    public function __construct(
        DIContainerInterface $container, 
        ControllerResolverInterface $resolver
    ) {
        $this->container = $container;
        $this->globals($GLOBALS);
        $this->cookies = $container['cookie'];
        $this->cookies->setAll(
            $this->globals('_COOKIE') ? $this->globals('_COOKIE') : array()
        );
        $this->resolver = $resolver;
    }
    /**
     * Создает и обрабатывает запрос к серверу
     * @todo разобраться с cookies
     * @param mixed  $uri URI запроса
     * @param mixed  $method Метод запроса
     * @param mixed  $get Массив данных для переменной $_GET
     * @param mixed  $post Массив данных для переменной $_POST
     * @param mixed  $server Массив данных для переменной $_SERVER
     * @param mixed  $files Массив данных для переменной $_FILES
     * @return NeironKernelRequestControllerResolver
     */
    public function create(
        $uri = null, 
        $method = null, 
        $get = null, $post = null, 
        $server = null, 
        $files = null
    ){
        $this->get($get);
        $this->post($post);
        $this->server($server);
        $this->globals($files, null, '_FILES');
        return $this->resolver->resolve(
                $this->container['routing']->match(
                        $this->decodeDetectUri($uri), $this->method($method)
                ), $this->container
        );
    }
    /**
     * Возвращает или определяет и декодирует строку uri
     * @param mixed $uri URI строка
     * @return string  Декодированная строка
     */
    private function decodeDetectUri($uri = null)
    {
        if ($uri === null) {
            if (!empty($this->server('PATH_INFO'))) {
                $uri = $this->server('PATH_INFO');
            } elseif (!empty($this->server('REQUEST_URI'))) {
                $uri = explode('?', $this->server('REQUEST_URI'))[0];
            }
        }
        $this->uri(rawurldecode(rtrim($uri, '/')));
    }
    /**
     * Задает/выдает (если есть) адрес страницы, которая привела браузер пользователя на эту страницу
     * @param string $refer Адрес страницы
     * @return mixed Если есть (или указан) адрес страницы то выдает его или возвращает false
     */
    public function referer($refer = null)
    {
        if ($refer != null) {
            $this->server('HTTP_REFERER', $refer);
        }
        if ($this->server('HTTP_REFERER') !== null) {
            return $this->server('HTTP_REFERER');
        }
        return false;
    }
    /**
     * Сохраняет/выводит данные пременной $GLOBALS
     * @param mixed $name Имя переменной
     * @param mixed $value Значение переменной
     * @param mixed $var Индех переменной
     * @return mixed
     */
    public function globals($name = null, $value = null, $var = false)
    {
        $glob = $var ? $this->globals[$var] : $this->globals;
        // Слияние массивов с заменой
        if (is_array($name)) {
            return $this->globals = array_merge($glob, $name);
        }
        // Передача всего содержимого
        if ($name === null && $value === null) {
            return $glob;
        }
        // Проверка на наличие и передача переменной из массива
        if ($name !== null && $value === null) {
            if (array_key_exists($name, $glob)) {
                return $glob[$name];
            }
            return false;
        }
        // Запись переменной
        if ($name !== null && $value !== null) {
            return $glob[$name] = $value;
        }
    }
    /**
     * Сохраняет/выводит метод запроса
     * @param mixed $method Метод запроса
     * @return string Метод запроса
     */
    public function method($method = null)
    {
        if ($method !== null) {
            $this->server('REQUEST_METHOD', $method);
        }
        return $this->server('REQUEST_METHOD');
    }
    /**
     * Сохраняет/выводит URI запроса
     * @param mixed $uri URI запроса
     * @return string URI запроса
     */
    public function uri($uri = null)
    {
        return isset($uri) ? $this->uri = $uri : $this->uri;
    }
    /**
     * Сохраняет/выводит данные пременной $_SERVER
     * @param mixed $name Имя переменной
     * @param mixed $value Значение переменной
     * @return mixed
     */
    public function server($name = null, $value = null)
    {
        return $this->globals($name, $value, '_SERVER');
    }
    /**
     * Сохраняет/выводит данные пременной $_GET
     * @param mixed $name Имя переменной
     * @param mixed $value Значение переменной
     * @return mixed
     */
    public function get($name = null, $value = null)
    {
        return $this->globals($name, $value, '_GET');
    }
    /**
     * Сохраняет/выводит данные пременной $_POST
     * @param mixed $name Имя переменной
     * @param mixed $value Значение переменной
     * @return mixed
     */
    public function post($name = null, $value = null)
    {
        return $this->globals($name, $value, '_POST');
    }
    /**
     * Сохраняет/выводит данные пременной $_FILES
     * @param mixed $name Имя переменной
     * @param mixed $value Значение переменной
     * @return mixed
     */
    public function files($name = null, $value = null)
    {
        return $this->globals($name, $value, '_FILES');
    }
}