# 升级路由

## 文档

- CodeIgniter 3.x URI 路由文档

- CodeIgniter 4.x URI 路由文档

## 变更内容

- 在 CI4 中，自动路由默认已禁用。

- 在 CI4 中，引入了新的、更安全的 自动路由（改进版）。

- 在 CI4 中，路由不再通过将路由设置为数组来配置。

- CI3 中的通配符 `(:any)`，在 CI4 中对应为占位符 `(:segment)`。CI4 中的 `(:any)` 会匹配多个段。参见 URI 路由。

## 升级指南

1. 如果以与 CI3 相同的方式使用自动路由，则需要启用 自动路由（传统版）。

2. 必须修改每一条路由的语法，并将其追加到 app/Config/Routes.php 中。例如：

   > - `$route['journals'] = 'blogs';` 改为 `$routes->add('journals', 'Blogs::index');`。这会映射到 `Blogs` 控制器中的 `index()` 方法。

   > - `$route['product/(:any)'] = 'catalog/product_lookup';` 改为 `$routes->add('product/(:segment)', 'Catalog::productLookup');`。不要忘记将 `(:any)` 替换为 `(:segment)`。

   > - `$route['login/(.+)'] = 'auth/login/$1';` 改为 `$routes->add('login/(.+)', 'Auth::login/$1');`

   > 备注

   > 为了向后兼容，这里使用了 `$routes->add()`。但是，出于安全原因， 强烈建议使用 HTTP 方法路由，例如 `$routes->get()`，而不是 `$routes->add()`。

## 代码示例

### CodeIgniter 3.x 版本

路径：application/config/routes.php：

    <?php
    defined('BASEPATH') OR exit('No direct script access allowed');

    // ...

    $route['posts/index']  = 'posts/index';
    $route['teams/create'] = 'teams/create';
    $route['teams/update'] = 'teams/update';

    $route['posts/create']   = 'posts/create';
    $route['posts/update']   = 'posts/update';
    $route['drivers/create'] = 'drivers/create';
    $route['drivers/update'] = 'drivers/update';
    $route['posts/(:any)']   = 'posts/view/$1';

### CodeIgniter 4.x 版本

路径：app/Config/Routes.php：

    <?php

    use CodeIgniter\Router\RouteCollection;

    /**
     * @var RouteCollection $routes
     */
    $routes->get('/', 'Home::index');

    $routes->add('posts/index', 'Posts::index');
    $routes->add('teams/create', 'Teams::create');
    $routes->add('teams/update', 'Teams::update');

    $routes->add('posts/create', 'Posts::create');
    $routes->add('posts/update', 'Posts::update');
    $routes->add('drivers/create', 'Drivers::create');
    $routes->add('drivers/update', 'Drivers::update');
    $routes->add('posts/(:segment)', 'Posts::view/$1');

备注

为了向后兼容，这里使用了 `$routes->add()`。但是，出于安全原因， 强烈建议使用 HTTP 方法路由，例如 `$routes->get()`，而不是 `$routes->add()`。