Несоответствие маршрутизации в codeigniter - неверный код маршрута - PullRequest
0 голосов
/ 24 мая 2019

У меня есть следующий код в моем rout.php в проекте codeigniter.

$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';

$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

$route['(:any)'] = 'login/view/$1';
$route['default_controller'] = 'login/view';

Следующий URL-адрес корректно переводит меня на страницу about (которая находится здесь: views / pages / about.php)

http://localhost:1234/ciblog/index.php/pages/view/about

Также http://localhost:1234/ciblog/index.php/news правильно выводит меня на страницу новостей, которая находится здесь: views / news / index.php

Я хотел бы, однако, http://localhost:1234/ciblog/index.php/about, чтобы перевести меня на страницу about, и вместо этого возвращается ошибка 404. Чтобы уточнить, я не хочу вводить «страницы / представление» в URL, чтобы перейти на страницу о. И то же самое для страницы входа. Я не хочу вводить логин / просмотр .... чтобы попасть на страницу login.php.

Я думал, что этот строковый код, организованный так, чтобы его можно было маршрутизировать таким образом, чтобы страницы / представление были пропущены (то есть каталог views / pages), чтобы он шел прямо на страницу about.php, но, очевидно, мне не хватает немного логики.

Контроллер для Pages.php выглядит так:

<?php
    class Pages extends CI_Controller{
        public function view($page = 'home')
{
        if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
        {
                // Whoops, we don't have a page for that!
                show_404();
        }

        $data['title'] = ucfirst($page); // Capitalize the first letter

        $this->load->view('templates/header', $data);
        $this->load->view('pages/'.$page, $data);
        $this->load->view('templates/footer', $data);
}
    }

Может кто-то указать на то, что я сделал неправильно, а также, в качестве принятого ответа, объяснить, как именно работает маршрутизация в простых терминах. Если я хотел просто создать новую страницу и создать маршрут (URL), который позволил бы мне получить доступ к этой странице с локального хоста / страницы (то есть напрямую), каков наилучший способ сделать это?

Для справки, скриншот структуры каталогов можно увидеть слева.

enter image description here

1 Ответ

0 голосов
/ 24 мая 2019

У вас есть два конфликтующих маршрута (:any).

$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['login/(:any)'] = 'login/view/$1';
$route['login'] = 'login/view';

$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

Во время начальной загрузки CI будет искать массив com $route, пытающийся найти соответствие для текущего запроса.Если совпадение найдено, оно будет использовать соответствующее значение в качестве контроллера / метода.


Если вы не планировали делать это таким образом, вам не нужен метод "view" на вашем контроллере.

Вы могли бы сделать что-то вроде этого:

class Pages extends CI_Controller{
  public function index()
  {
    $data['title'] = "Home";
    $this->load->view('templates/header', $data);
    $this->load->view('pages/home', $data);
    $this->load->view('templates/footer', $data);
  }
  public function about()
  {
    $data['title'] = "About";
    $this->load->view('templates/header', $data);
    $this->load->view('pages/about', $data);
    $this->load->view('templates/footer', $data);
  }
}

Таким образом, ваш маршрут мог бы быть:

$route['about'] = 'pages/about';
$route['home'] = 'pages/home';
$route['default_controller'] = 'pages/home';

Это более многословно, но легко понять.

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