静态页面

注意

本教程假设您已下载 CodeIgniter 并 在您的开发环境中安装了框架

您要做的第一件事是设置路由规则来处理静态页面。

设置路由规则

路由将 URI 与控制器的函数关联。控制器只是一个帮助委托工作的类。我们稍后将创建一个控制器。

让我们设置路由规则。打开位于 **app/Config/Routes.php** 的路由文件。

一开始那里唯一的路由指令应该是

<?php

use CodeIgniter\Router\RouteCollection;

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

此指令表示任何没有指定内容的传入请求都应由 index() 方法处理,该方法位于 Home 控制器中。

添加以下行,**在** '/' 的路由指令**之后**。

use App\Controllers\Pages;

$routes->get('pages', [Pages::class, 'index']);
$routes->get('(:segment)', [Pages::class, 'view']);

CodeIgniter 从上到下读取路由规则,并将请求路由到第一个匹配的规则。每个规则都是一个正则表达式(左侧)映射到控制器和方法名称(右侧)。当请求进来时,CodeIgniter 会寻找第一个匹配项,并调用相应的控制器和方法,可能还会带参数。

有关路由的更多信息,请参阅 URI 路由

这里,$routes 对象中的第二个规则匹配对 URI 路径 /pages 的 GET 请求,并将其映射到 Pages 类的 index() 方法。

$routes 对象中的第三个规则匹配使用占位符 (:segment) 的 URI 段的 GET 请求,并将参数传递给 Pages 类的 view() 方法。

让我们创建第一个控制器

接下来要做的是设置一个 **控制器** 来处理静态页面。控制器只是一个帮助委派工作的类。它是您 Web 应用程序的粘合剂。

创建 Pages 控制器

app/Controllers/Pages.php 中创建一个文件,其中包含以下代码。

重要

您应该始终注意文件名的大小写。许多开发人员在 Windows 或 macOS 上使用不区分大小写的文件系统进行开发。但是,大多数服务器环境使用区分大小写的文件系统。如果文件名大小写不正确,在本地工作的代码在服务器上将无法工作。

<?php

namespace App\Controllers;

class Pages extends BaseController
{
    public function index()
    {
        return view('welcome_message');
    }

    public function view($page = 'home')
    {
        // ...
    }
}

您创建了一个名为 Pages 的类,它有一个 view() 方法,该方法接受一个名为 $page 的参数。它还有一个 index() 方法,与 app/Controllers/Home.php 中的默认控制器相同;该方法显示 CodeIgniter 欢迎页面。

注意

本教程中提到了两个 view() 函数。一个是使用 public function view($page = 'home')return view('welcome_message') 创建的类方法,用于显示视图。两者在技术上都是函数。但是,当您在类中创建函数时,它被称为方法。

Pages 类扩展了 BaseController 类,该类扩展了 CodeIgniter\Controller 类。这意味着新的 Pages 类可以访问 CodeIgniter\Controller 类(system/Controller.php)中定义的方法和属性。

**控制器将成为您 Web 应用程序中每个请求的中心**。与任何 PHP 类一样,您可以在控制器中将其引用为 $this

创建视图

现在您已经创建了第一个方法,是时候创建一些基本的页面模板了。我们将创建两个“视图”(页面模板),它们充当我们的页面页脚和页眉。

在 **app/Views/templates/header.php** 中创建页眉并添加以下代码

<!doctype html>
<html>
<head>
    <title>CodeIgniter Tutorial</title>
</head>
<body>

    <h1><?= esc($title) ?></h1>

页眉包含您希望在加载主视图之前显示的基本 HTML 代码,以及标题。它还会输出 $title 变量,我们将在后面的控制器中定义。现在,在 **app/Views/templates/footer.php** 中创建一个页脚,其中包含以下代码

    <em>&copy; 2022</em>
</body>
</html>

注意

如果您仔细查看 **header.php** 模板,我们会使用 esc() 函数。它是 CodeIgniter 提供的一个全局函数,有助于防止 XSS 攻击。您可以在 全局函数和常量 中了解更多信息。

向控制器添加逻辑

创建 home.php 和 about.php

之前您设置了一个带有 view() 方法的控制器。该方法接受一个参数,即要加载的页面的名称。

静态页面主体将位于 **app/Views/pages** 目录中。

在该目录中,创建两个名为 **home.php** 和 **about.php** 的文件。在这些文件中,输入一些文本 - 任何您喜欢的文本 - 并保存它们。如果您想特别不原创,可以尝试“Hello World!”。

完成 Pages::view() 方法

为了加载这些页面,您必须检查请求的页面是否真的存在。这将是上面创建的 Pages 控制器中 view() 方法的主体

<?php

namespace App\Controllers;

use CodeIgniter\Exceptions\PageNotFoundException; // Add this line

class Pages extends BaseController
{
    // ...

    public function view($page = 'home')
    {
        if (! is_file(APPPATH . 'Views/pages/' . $page . '.php')) {
            // Whoops, we don't have a page for that!
            throw new PageNotFoundException($page);
        }

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

        return view('templates/header', $data)
            . view('pages/' . $page)
            . view('templates/footer');
    }
}

并在 namespace 行之后添加 use CodeIgniter\Exceptions\PageNotFoundException; 以导入 PageNotFoundException 类。

现在,当请求的页面存在时,它将被加载,包括页眉和页脚,并返回给用户。如果控制器返回一个字符串,它将显示给用户。

注意

控制器必须返回一个字符串或一个 Response 对象。

如果请求的页面不存在,则会显示“404 页面未找到”错误。

此方法的第一行检查页面是否实际存在。PHP 的原生 is_file() 函数用于检查文件是否位于预期位置。 PageNotFoundException 是 CodeIgniter 异常,它会导致显示默认错误页面。

在页眉模板中, $title 变量用于自定义页面标题。标题的值在此方法中定义,但它不是分配给变量,而是分配给 $data 数组中的标题元素。

最后要做的事情是按应显示的顺序加载视图。CodeIgniter 内置的 view() 函数将用于执行此操作。 view() 函数中的第二个参数用于将值传递给视图。 $data 数组中的每个值都分配给一个名称与其键相同的变量。因此,控制器中 $data['title'] 的值等效于视图中的 $title

注意

传递给 view() 函数的任何文件和目录名称必须与实际目录和文件本身的大小写匹配,否则系统将在区分大小写的平台上抛出错误。您可以在 Views 中了解更多信息。

运行应用程序

准备测试?您无法使用 PHP 的内置服务器运行应用程序,因为它不会正确处理 public 中提供的 .htaccess 规则,这些规则消除了在 URL 中指定“index.php/”的必要性。CodeIgniter 有自己的命令,您可以使用它。

从命令行,在项目的根目录下

php spark serve

将启动一个 Web 服务器,可在端口 8080 上访问。如果您在浏览器中将位置字段设置为 **localhost:8080**,您应该会看到 CodeIgniter 欢迎页面。

现在访问 **localhost:8080/home**。它是否被正确路由到 view() 方法中的 Pages 控制器?太棒了!

您应该看到类似以下内容

../_images/tutorial1.png

您现在可以在浏览器位置字段中尝试几个 URL,以查看您上面创建的 Pages 控制器产生了什么……

URL

将显示

localhost:8080/

CodeIgniter 的“欢迎”页面。来自 Home 控制器中 index() 方法的结果。

localhost:8080/pages

来自我们 Pages 控制器中的 index() 方法的结果,它将显示 CodeIgniter 的“欢迎”页面。

localhost:8080/home

显示您上面创建的“主页”,因为我们明确要求它。来自我们 Pages 控制器中的 view() 方法的结果。

localhost:8080/about

您上面创建的“关于”页面,因为我们明确要求它。

localhost:8080/shop

一个“404 - 文件未找到”错误页面,因为没有 **app/Views/pages/shop.php**。