CodeIgniter 路由:带有示例的 URL 路由

CodeIgniter 路由是什么?

路由负责响应 URL 请求。路由会将 URL 匹配到预定义的路由。如果没有找到匹配的路由,CodeIgniter 将会抛出“页面未找到”异常。

CodeIgniter 中的路由使用以下公式定义

example.com/Controller/Method/Parameter/

此处,

  • Controller - 映射到应该响应 URL 的控制器名称。
  • Method – 映射到控制器中应该响应 URI 请求的方法。
  • Parameter – 此部分是可选的。

CodeIgniter 路由示例

现在,让我们通过一个 CodeIgniter 的实际 URL 路由示例来了解一下。 CodeIgniter

考虑以下 URL https://:3000/contacts/edit/1

此处,

  • 响应上述 URL 的控制器名称是“contacts”
  • Contacts 控制器类中的方法是“edit”
  • edit 方法接受一个参数。在我们的示例中,“1”的值被传递给该方法。

以下是我们计划做的事情的简要背景

  • 路由 – 路由负责响应 URL 请求。CodeIgniter 路由会将 URL 匹配到预定义的路由。如果没有找到匹配的路由,CodeIgniter 将会抛出“页面未找到”异常。
  • 控制器 – 路由链接到控制器。控制器将模型和视图粘合在一起。控制器从模型请求数据/业务逻辑,并通过视图表示层返回结果。一旦 URL 与 CodeIgniter 中的路由匹配,它就会被转发到一个控制器公共函数,该函数与数据源、业务逻辑交互,并返回显示结果的视图。
  • 视图 – 视图负责表示。视图通常是 HTML、CSS 和 JavaScript 的组合。这是负责向用户显示网页的部分。通常,显示的数据通常是从数据库或任何其他可用数据源检索的。

要学习如何在实际项目中实现路由器,我们将假设我们正在创建一个管理联系人信息的应用程序。下表显示了我们将要处理的 URL。

序号 URL 路由 控制器 方法
1 / $route[‘default_controller’] Welcome index
2 /contacts $route[‘contacts’] Contacts index
3 /contacts/create $route[‘create’] Contacts create
4 /contacts/edit/id $route[‘edit/:id’] Contacts edit
5 /contacts/update/id $route[‘update/:id’] Contacts update
6 /contacts/delete/id $route[‘delete/:id’] Contacts 删除

我们将在上述表格的基础上创建应用程序的路由。我们已经定义了 URL、CodeIgniter 路由,并将它们映射到相应的控制器和方法名。

为应用程序创建 URL 路由

让我们为我们的教程项目创建 CodeIgniter URL 路由

打开 application/config/routes.php

修改路由以匹配以下内容

$route['default_controller'] = 'welcome';
$route['contacts'] = 'contacts';
$route['create'] = 'contacts/create';
$route['edit/:id'] = 'contacts/edit';
$route['update/:id'] = 'contacts/update';
$route['delete/:id'] = 'contacts/delete';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

此处,

  • $route[‘default_controller’] = ‘welcome’; 定义默认控制器 Welcome。
  • $route[‘contacts’] = ‘contacts’; 定义一个 contacts 路由,该路由调用 Contacts 控制器中的 index 方法
  • $route[‘create’] = ‘contacts/create’; 定义一个 create 路由,该路由指向 Contacts 控制器并调用 create 方法。
  • $route[‘edit/:id’] = ‘contacts/edit’; 定义一个 edit 路由,该路由接受一个 id 参数,并指向 Contacts 控制器的 edit 方法
  • $route[‘update/:id’] = ‘contacts/update’; 定义一个 update 路由,该路由接受一个 id 参数,并指向 Contacts 类的 update 方法。
  • $route[‘delete/:id’] = ‘contacts/delete’; 定义一个 delete 路由,该路由接受一个 id 参数,并指向 Contacts 控制器的 delete 方法。

下表显示了从上述定义的路由派生的相应 URL

序号 路由 相应的 URL
1 $route[‘default_controller’] = ‘welcome’; https://:3000
2 $route[‘contacts’] = ‘contacts’; https://:3000/contacts
3 $route[‘create’] = ‘contacts/create’; https://:3000/contacts/create
4 $route[‘edit/:id’] = ‘contacts/edit’; https://:3000/contacts/edit/1
5 $route[‘update/:id’] = ‘contacts/update’; https://:3000/contacts/update/1
6 $route[‘delete/:id’] = ‘contacts/delete’; https://:3000/contacts/delete/1

现在我们已经涵盖了路由,让我们创建将响应路由中指定的动作的 Contacts 控制器。

在 application/controllers/Contacts.php 中创建一个新的 CodeIgniter Route 文件 Contacts.php

添加以下代码:

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

class Contacts extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->helper('url');
    }

    public function index() {
        $this->load->view('header');
        $this->load->view('contacts/index');
        $this->load->view('footer');
    }

    public function create() {
        $this->load->view('header');
        $this->load->view('contacts/create');
        $this->load->view('footer');
    }

    public function edit($id) {
        $this->load->view('header');
        $this->load->view('contacts/edit');
        $this->load->view('footer');
    }

    public function update($id) {
        $this->load->view('header');
        $this->load->view('contacts/update');
        $this->load->view('footer');
    }

    public function delete($id) {
        $this->load->view('header');
        $this->load->view('contacts/delete');
        $this->load->view('footer');
    }
}

此处,

  • Class contacts extends CI_Controller {..} 定义了我们的控制器类,并扩展了 CodeIgniter 自带的 CI_Controller 类。
  • 上面定义的方法对应我们定义的路由,而带有参数的方法(如 delete)则接受 $id 参数
  • 请注意,这些函数加载了三个(3)个视图。标题和页脚对所有方法都是通用的。中间视图非常特定于操作,即 delete 函数用于删除,create 函数用于创建视图,依此类推。另一个要记住的重要事项是,视图是从 contacts 子目录加载的。

CodeIgniter 视图

在测试 CodeIgniter 路由和参数在浏览器中的显示效果之前,我们还需要再进行一步。让我们创建与上述控制器方法对应的视图。

下图显示了您的应用程序的外观

CodeIgniter Views

在 application/views 中创建以下文件

header.php – this file will contain contacts app menu and the header
footer.php – this files will contain the application footer.

在 views application/views/contacts 中创建一个新的 contacts 目录

在里面创建以下文件

index.php
create.php
edit.php

您的文件结构应如下所示

CodeIgniter Views

现在让我们更新 header.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>CodeIgniter Routes</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
        <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
    </head>
    <body>
        <section class="section">
            <div class="container">
                <h1 class="title">CI Contacts v1</h1>
                <h2 class="subtitle">CodeIgniter contacts management app</h2>
                <div class="columns">
                    <div class="column is-one-quarter">
                        <aside class="menu">
                            <p class="menu-label">
                                General
                            </p>
                            <ul class="menu-list">
                                <li><a class="is-active" href="#">Dashboard</a></li>
                                <li><a href="<?=site_url('contacts/create')?>">New Contact</a></li>
                                <li><a href="<?=site_url('contacts/edit/1')?>">Edit Contacts</a></li>
                            </ul>
                            <p class="menu-label">
                                Settings
                            </p>
                            <ul class="menu-list">
                                <li><a href="#">SMS</a></li>
                                <li><a href="#">Email</a></li>
                            </ul>
                        </aside>
                    </div>

此处,

  • 上述 HTML 代码从 CDN 网络加载 Burma CSS。

以下是 footer.php 的代码

            </div>
            </div>
        </section>
    </body>
</html>

现在让我们为 contacts 添加 index.php、edit.php 和 create.php 文件的代码。

index.php
<div class="column">Index content goes here...</div>
edit.php
<div class="column">Edit content goes here...</div>
create.php
<div class="column">Create content goes here...</div>

您可以保存所有所做的更改。

在浏览器中打开以下 URL https://:3000/contacts/

您可以点击“New Contact”和“Edit Contact”链接,看看会发生什么

摘要

  • CI 中的路由负责响应 URL 请求。路由会将 URL 匹配到预定义的路由。如果没有找到 CodeIgniter 路由匹配,CodeIgniter 将会抛出“页面未找到”异常。
  • CI 路由负责响应 URL 请求。路由会将 URL 匹配到预定义的路由。
  • 控制器将模型和视图粘合在一起。控制器从模型请求数据/业务逻辑,并通过视图表示层返回结果。
  • 视图负责表示。视图通常是 HTML、CSS 和 JavaScript 的组合。
  • 在本教程中,我们学习了如何在 CodeIgniter 中为实际应用创建路由,并介绍了您开始开发 CodeIgniter 所需的路由基础知识。