@Gleb316
Учиться и не бросать на половине.

Не работают Get параметры в MVC?

Доделал сайт построенный на основе https://github.com/victor-zinchenko/shop.php-start.com
в конце когда надо было подключать яндекс метрику он просил проверить ссылки вида
site.ru/?yclid=199557950487360 если добавить к любой страницы get запрос то сразуже вылазит несуществующая страница. В чем может быть проблема ? вот мой роутер
<?php
/**
 * Класс Router
 * Компонент для работы с маршрутами
 */
class Router
{
    /**
     * Свойство для хранения массива роутов
     * @var array 
     */
    private $routes;
    /**
     * Конструктор
     */
    public function __construct()
    {
        // Путь к файлу с роутами
        $routesPath = ROOT . '/config/routes.php';
        // Получаем роуты из файла
        $this->routes = include($routesPath);
    }
    /**
     * Возвращает строку запроса
     */
    private function getURI()
    {
        if (!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    # Ошибка 404 Router::Error();
      static public function Error() {
	// выводит сообщение об ошибке и завершает работу контроллера, примерно так:
	header('HTTP/1.1 404 Not Found');
    header("Status: 404 Not Found");
	$error = 'Соответствующее ошибке сообщение пользователю, например, Страницы не существует';
	include 'jd-admin/404.php';  // шаблон для отображения ошибки
	die();	
       }
       
    /**
     * Метод для обработки запроса
     */
    public function run()
    {
        // Получаем строку запроса
        $uri = $this->getURI();
        
        //для русского url
       $uri = rawurldecode($uri);
        // Проверяем наличие такого запроса в массиве маршрутов (routes.php)
        foreach ($this->routes as $uriPattern => $path) {
            // Сравниваем $uriPattern и $uri
            if (preg_match("~$uriPattern~", $uri)) {
                // Получаем внутренний путь из внешнего согласно правилу.
                $internalRoute = preg_replace("~^$uriPattern.*~", $path, $uri);
                // Определить контроллер, action, параметры
                $segments = explode('/', $internalRoute);
                $controllerName = array_shift($segments) . 'Controller';
                $controllerName = ucfirst($controllerName);
                $actionName = 'action' . ucfirst(array_shift($segments));
               
                $parameters = $segments;
               
             
                // Подключить файл класса-контроллера
                $controllerFile = ROOT . '/controllers/' .
                        $controllerName . '.php';
                
                if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                }
               
                 if(!is_callable(array($controllerName, $actionName))){
                    
                   Router::Error();
                   
                }

                // Создать объект, вызвать метод (т.е. action)
                $controllerObject = new $controllerName;
                /* Вызываем необходимый метод ($actionName) у определенного 
                 * класса ($controllerObject) с заданными ($parameters) параметрами
                 */
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                // Если метод контроллера успешно вызван, завершаем работу роутера
               
                if ($result != null) {
                    break;
                }
            }
        
        } 
      
        
    }
}
  • Вопрос задан
  • 521 просмотр
Решения вопроса 1
@k2lhu
Не используйте данный пример в реальных сайтах, уже не первый раз сталкиваюсь с этим кодом )
А не срабатывает путь по простой причине - если вы действительно сами делали сайт, то должны знать что происходит в get параметрами, приведу пример как раз с вашего сайта, у вас есть страничка по адресу site/product/43 , для того чтобы вообще зайти на нее вы в site/config/routes.php добавили правило,
'product/([0-9]+)' => 'product/view/$1'
Левая часть - то что отражается у вас в адресной строке, правая часть - что это вообще на самом деле, ваш класс роутера получает часть что слева, затем начинает перебирать файл с вашими роутами(путями), и так как у вас сразу настроено чпу то только такой вид и будет работать. И получив от вас в строке указанный вами путь с параметрами - он в списке путей не находит подходящего правила и выкидывает исключение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы