этот тип маршрутизации возможен в CodeIgniter? - PullRequest
0 голосов
/ 09 января 2019

У меня есть база данных с категориями и постами, в настоящее время я обращаюсь к нему через их контроллеры способом: "/ category / id" и "/ post / id"

но теперь я хочу получить доступ по следующему пути: "/ Category_name / POST_NAME"

Логично было бы использовать "/application/config/routes.php" и создайте: $route['(:any)/(:any)'] = 'post';

Проблема в том, что в моем желаемом пути возможны такие подкатегории, как "/ category1_name / category2_name / post_name"

Я пытаюсь создать следующий маршрут: $route['(\w|/)*'] = 'route'; но это вызывает проблему с моими другими контроллерами и не рекомендуется вызывать контроллер с другого контроллера.

Можно ли сгенерировать мой путь для поиска?

Ответы [ 3 ]

0 голосов
/ 10 января 2019

На данный момент я пытаюсь это:

Как существуют подкатегории, количество категорий в пути является переменным, как URL не является бесконечным, я определил максимальное количество категорий в пути, и я включаю этот код в "application/config/routes.php":

$route['(:any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0;
    else return 'route';
};
$route['(:any)/(:any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0.'/'.$param1;
    else return 'route';
};

$route['(:any)/(:any)/(:any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0.'/'.$param1.'/'.$param2;
    else return 'route';
};

$route['(:any)/(:any)/(:any)/:(any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0.'/'.$param1.'/'.$param2.'/'.$param3;
    else return 'route';
};

$route['(:any)/(:any)/(:any)/(:any)/(:any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0.'/'.$param1.'/'.$param2.'/'.$param3.'/'.$param4;
    else return 'route';
};

$route['(:any)/(:any)/(:any)/(:any)/(:any)/(:any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0.'/'.$param1.'/'.$param2.'/'.$param3.'/'.$param4.'/'.$param5;
    else return 'route';
};

Это очень уродливый код, но функциональный. Я пытаюсь улучшить его с помощью цикла, который будет устанавливать максимум категорий с переменной, но у меня есть проблемы с переменными внутри функции обратного вызова.

Пример:

$i = 4;
$route['(:any)'] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5=""){
    global $i;
    if($param0 == "user" || $param0 == "home" || $param0 == "post" || $param0 == "user") return $param0;
    else return 'route';
};
Внутри функции обратного вызова $ i пусто,
0 голосов
/ 10 января 2019

Наконец, я улучшил код, я обращаюсь к переменным извне из анонимной функции с помощью use (), устанавливаю максимальное количество категорий в URL и создаю массив с именами контроллеров, в случае, если путь - это путь контроллера, это маршрутизация ему, если нет, маршрутизация к контроллеру маршрута

код в "application/config/routes.php":

$my_controllers = array();
$directory = opendir(APPPATH."controllers");
while($file = readdir($directory)){
    if($file != "index.html" && $file != "." && $file != "..") array_push($my_controllers, strtolower(str_replace(".php", '', $file)));
}
$max_categories = 5; //if your need more add $params in the anonymous function, if you need less, only change the num
$temp_path = "";
for($i=0;$i<=$max_categories;$i++){
    if($i!=0) $temp_path .= '/';
    $temp_path .= '(:any)';

    $route[$temp_path] = function ($param0="",$param1="",$param2="",$param3="",$param4="",$param5="") use ($i,$my_controllers){
        $temp_cond = false;
        foreach ($my_controllers as $value) {
            $temp_cond = $temp_cond || $param0 == $value;
        }
        if($temp_cond){ 
            $temp_return = $param0;
            for($j=1;$j<=$i;$j++){
                $temp_return .= '/';
                $varvar = "param$j";
                $temp_return .= $$varvar;
            }
        return $temp_return;    
        }
        else return 'route';
    };
}
0 голосов
/ 09 января 2019
way: "/category/id" and "/post/id"

Вы не можете перенаправить кого-либо на первое место, чтобы достичь своего URL

$route['category/(:any)'] = 'post/load/category/$1'; 
$route['post/(:any)'] = 'post/load/post/$1'; 

и на вашем посту контроллера создайте метод load с 2 параметрами .. вроде

<?php

class Post extends CI_Controller {
 function load($parameter1 , $parameter2 )
 {
  echo $parameter1."<br>";
  echo $parameter2;
 }
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...