Ошибка кода в строках запроса Codeigniter - PullRequest
0 голосов
/ 14 декабря 2018

У меня уже есть настроенный проект с URL, как показано ниже.

index.php?c=controllerName&m=methodName

И параметр в URL выше, как показано ниже.

index.php?c=controllerName&m=methodName&selDeg=manager

Я хочу использовать url, как показано ниже, для моих недавно созданных модулей.

admin/Items/1

Но хочу использовать URL первого типа, как и для ранее разработанных модулей.

Можно ли использовать url с index.php для старых модулей и без index.php для новых модулей.

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете подготовить свой конфиг так:

$config['base_url'] = 'your_base_url';
$config['index_page'] = ''; // empty string
$config['enable_query_strings'] = FALSE; // keep it to default FALSE, you can use it even without enabling it here

и ваш .htaccess вот так:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

Я думаю, что это так, теперь вы можете использовать оба segments и query_strings вот так:

http://localhost/codeigniter/?c=welcome&m=index
http://localhost/codeigniter/welcome/index
http://localhost/codeigniter/index.php/welcome/index
http://localhost/codeigniter/index.php?c=welcome&m=index
http://localhost/codeigniter/index.php/?c=welcome&m=index

Я уже протестировал оба в моей среде, и это прекрасно работает.


Редактировать : вмой шаблон codeigniter Я расширил свой основной маршрутизатор и немного изменил метод _set_routing() следующим образом:

Конечно, менять базовую систему - это плохая практика, поэтому вам необходимо расширить файл основного маршрутизатора исоздайте MY_Router.php в application/core и увеличьте CI_Router следующим образом:

class MY_Router extends CI_Router
{
protected function _set_routing()
{
    if (file_exists(APPPATH.'config/routes.php'))
    {
        include(APPPATH.'config/routes.php');
    }

    if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
    {
        include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
    }

    if (isset($route) && is_array($route))
    {
        isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
        isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
        unset($route['default_controller'], $route['translate_uri_dashes']);
        $this->routes = $route;
    }

    $_c = trim($this->config->item('controller_trigger'));
    if ( ! empty($_GET[$_c]))
    {
        $this->uri->filter_uri($_GET[$_c]);
        $this->set_class($_GET[$_c]);

        $_f = trim($this->config->item('function_trigger'));
        if ( ! empty($_GET[$_f]))
        {
            $this->uri->filter_uri($_GET[$_f]);
            $this->set_method($_GET[$_f]);
        }

        $this->uri->rsegments = array(
            1 => $this->class,
            2 => $this->method
        );
    }
    else
    {
        if ($this->uri->uri_string !== '')
        {
            $this->_parse_routes();
        }
        else
        {
            $this->_set_default_controller();
        }
    }
}
}

Теперь у вас есть лучшее из обоих миров, вы сохраните свои сегменты с его вкусностями нетронутыми, но всегда будете выглядетьдля получения c=&m=, я надеюсь, это достаточно ясно.

Мы сохранили все по умолчанию и заставили его проверять запрос на получение с c и m почти так же, как enable_query_strings, но не включали его и ничего не портили, чтобы продолжать работать с сегментами в том виде, как они есть...

...