За последние 24 часа нас посетили 8304 программиста и 479 роботов. Сейчас ищет 261 программист ...

Параметри из роута не передаются в метод

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 6 дек 2018.

  1. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    1.684
    Симпатии:
    86
    Добрый день программисты, помогите мне с роутом моим, я не могу передать данные из ссылки в метод, ссилка вида site/category/1 или site/category/1/page/10 - ID которое в конце ссылки должно попадать в метод, каким образом я могу понять?
    Код Router.php:
    PHP:
    1. <?php
    2. namespace app\core;
    3.  
    4. use app\core\View;
    5.  
    6. /**
    7. * Data: 25.10.2017
    8. * Класс Router
    9. * Компонент для работы с маршрутами
    10. */
    11. class Router
    12. {
    13.  
    14.     protected $routes = []; # cвойство для хранения массива роутов
    15.    protected $params = []; # парамеры передаваемые
    16.  
    17.   /**
    18.    * Консруктор подключаем наши роуты
    19.    */
    20.     public function __construct()
    21.     {
    22.         # путь к файлу с роутами
    23.        $routesArr = require 'app/config/routes.php';
    24.  
    25.         foreach ($routesArr as $key => $val) {
    26.             # получаем массив роутов, передаем данные массива в функцию add();
    27.            $this->add($key, $val);  
    28.         }
    29.     }
    30.  
    31.  
    32.    /**
    33.     * $route - маршрут которые попадают в адрессную строку
    34.     * $params - параметры пути(controller, action)
    35.     */
    36.     public function add($route, $params)
    37.     {
    38.         $route = preg_replace('/{([a-z]+):([^\}]+)}/', '(?P<\1>\2)', $route);
    39.         $route = '#^' .$route. '$#'; # добавляем в начало строки '#^'..'$#' к выражение для $route
    40.        $this->routes[$route] = $params; # ключ массива $route а значение(параметры) = $params
    41.    }
    42.  
    43.     public function match()
    44.     {
    45.         # получаем путь с адрессной строки убираем один слеш
    46.        $url = trim($_SERVER['REQUEST_URI'], '/');
    47.         # перебираем в цикле наш массив роутов $this->routes
    48.        # получаем из него роуты(путь) и параметры(контроллери и екшен)
    49.        foreach ($this->routes as $route => $params) {
    50.             if ( preg_match($route, $url, $matches) )
    51.             {
    52.                 foreach ($matches as $key => $match)
    53.                 {
    54.                     if (is_string($key)) {
    55.                         if (is_numeric($match)) {
    56.                             $match = (int) $match;
    57.                         }
    58.                         $params[$key] = $match;
    59.                     }
    60.                 }
    61.                 $this->params = $params;
    62.                 return true;
    63.             }
    64.         }
    65.         return false;
    66.     }
    67.  
    68.  
    69.     public function run()
    70.     {
    71.         # если маршрут найден, возвращаем его иначе ошибка 404
    72.        if($this->match())
    73.         {
    74.             # получаем путь к контроллеру делаем первую букву заглавной для контроллера
    75.            $path = 'app\controllers\\'.ucfirst($this->params['controller']). 'Controller';
    76.             # если класс с таким названием существует покажем его иначе на ошибку 404
    77.            if(class_exists($path))
    78.             {
    79.                 $action = $this->params['action'].'Action';
    80.                 # если есть такая функция метод возвращаем удачу иначе ошибка 404
    81.                if(method_exists($path, $action))
    82.                 {
    83.                     $controller = new $path($this->params);
    84.                     $controller->$action();
    85.                 }else{
    86.                     echo 'Action: '.$this->params['action'] . ' не найден';
    87.                     echo 'Params: '.$this->params['id'] . ' не передан';
    88.                     // View::errorCode(404);
    89.                 }
    90.             }else{
    91.                 echo 'Контроллер: ' . $this->params['controller'] . ' не найден';
    92.                 // View::errorCode(404);
    93.             }
    94.         }else{
    95.             View::errorCode(404);
    96.         }
    97.     }
    98.  
    99.  
    100. }
    Сами маршруты файл routes.php:
    PHP:
    1. <?php
    2.  
    3. return [
    4.     '' => [
    5.         'controller' => 'main',
    6.         'action' => 'index',
    7.     ],
    8.  
    9.     'category/{id:\d+}/{page:\d+}' => [
    10.         'controller' => 'CategoryGame',
    11.         'action' => 'category',
    12.     ],
    13.  
    14.     'category/{id:\d+}' => [
    15.         'controller' => 'CategoryGame',
    16.         'action' => 'category',
    17.     ],
    18. ];
    общий контроллер для всех контроллеров Controller.php:
    PHP:
    1. <?php
    2.  
    3. namespace app\core;
    4.  
    5. use app\core\View;
    6.  
    7. /**
    8. *    общий контролле для всех контроллеров
    9. */
    10. abstract class Controller {
    11.  
    12.     public $route; # свойство роутов -  наши роуты
    13.    public $view; # свойство view - наш вид
    14.  
    15.     // public function __construct()
    16.     // {
    17.     //     $this->view = new View(); # передаем полученный путь $route с маршрутами в контроллер View()
    18.     // }
    19.  
    20.     public function __construct($route)
    21.     {
    22.         $this->route = $route; # получаем путь к класу и методу
    23.        $this->view = new View($route); # передаем полученный путь $route с маршрутами в контроллер View()
    24.        // $this->model = $this->loadModel($route['controller']); # получаем модель
    25.     }
    26. }
    контроллер в какой должна передаться ID CategoryGameController.php:
    PHP:
    1. <?php
    2.  
    3. namespace controllers;
    4.  
    5. use app\core\Controller;
    6. use app\lib\Pagination;
    7. use app\models\CategoryGame;
    8. use app\models\UserProductGame;
    9.  
    10.  
    11. /**
    12. * Контроллер CategoryGameController
    13. * Категория(каталог) продаваемых игр
    14. */
    15. class CategoryGameController extends Controller
    16. {
    17.  
    18.     /**
    19.      * Action для страницы "Категория продаваемых игр" (находится в главном меню)
    20.      */
    21.     public function indexAction()
    22.     {
    23.         # Список категорий продаваемых игр для левого меню
    24.        $categories = new CategoryGame();
    25.         $categories = $categories->getCategoriesList();
    26.  
    27.         # Список последних уроков
    28.        $product = new UserProductGame();
    29.         $latestGame = $product->getLatestProducts(12);
    30.  
    31.         # Подключаем вид
    32.        require_once(ROOT . '/views/category/index.php');
    33.         return true;
    34.     }
    35.  
    36.  
    37.     /**
    38.      * Action для страницы "Категория продаваемых игр" (находится в левом меню)
    39.      * @param   $categoryId - id категории
    40.      * @param   $page - по умолчанию значение
    41.      */
    42.     public function categoryAction($categoryId, $page = 1)
    43.     {
    44.         var_dump($this->route);
    45.         # Список категорий продаваемых игр для левого меню
    46.        $category = new CategoryGame();
    47.         $categories = $category->getCategoriesList();
    48.  
    49.         # Список уроков в категории
    50.        $product = new UserProductGame();
    51.         $categoryGame = $product->getProductsListByCategory($categoryId, $page);
    52.  
    53.         # Общее количетсво уроков (необходимо для постраничной навигации)
    54.        $total = $product->getTotalProductsInCategory($categoryId);
    55.  
    56.         # Создаем объект Pagination - постраничная навигация
    57.        $pagination = new Pagination($total, $page, SHOW_BY_DEFAULT, 'page-');
    58.  
    59.         # Подключаем вид
    60.        require_once(ROOT . '/views/category/category.php');
    61.         return true;
    62.     }
    63.  
    64. }
    модель от контроллера CategoryGame.php
    PHP:
    1. <?php
    2.  
    3. namespace app\models;
    4.  
    5. use app\core\Model;
    6.  
    7. /**
    8. * Класс CategoryGame - модель для работы с выводом категорий в сайт бар на сайте
    9. */
    10. class CategoryGame extends Model
    11. {
    12.  
    13. ##############################################################################################
    14.    /**
    15.      * Метод "возвращает массив категорий для списка на сайте"
    16.      * @return array - массив с категориями
    17.      */
    18.     public function getCategoriesList()
    19.     {
    20.         return $this->db->sel('
    21.            SELECT `id`, `name`
    22.            FROM `game_category`
    23.            WHERE `status` = "1"
    24.            ORDER BY `sort_order`, `name`
    25.            ASC');
    26.     }
    27. ##############################################################################################
    28.  
    29.  
    30.  
    31. ##############################################################################################
    32.    /**
    33.      * Метод "возвращает категорию с указанным id"
    34.      * @param integer $id - id категории
    35.      * @return array - результат с информацией о категории
    36.      */
    37.     public function getCategoryById($id)
    38.     {
    39.         # Текст запроса к БД
    40.        $result = $this->db->sel('SELECT * FROM `game_category` WHERE `id` = ?', [$id], false);
    41.  
    42.         if($result)
    43.         {
    44.             return $result;
    45.         }
    46.     }
    47. ##############################################################################################
    48.  
    49.  
    50. }
    посмотрите пожалуйста на это добро и скажите пожалуйста если сможете почему у меня ID не попадает из роутера в класс метода. СПАСИБО всех кто откликнеться, и поможет разобраться).
     
  2. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    1.684
    Симпатии:
    86
    ясно тут забыли все как это делаться :D
    или второй вариант, слишком много кода нужно посмотреть :D