静态页面
注意
本教程假设您已下载 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>© 2022</em>
</body>
</html>
向控制器添加逻辑
创建 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
。
运行应用程序
准备测试?您无法使用 PHP 的内置服务器运行应用程序,因为它不会正确处理 public 中提供的 .htaccess 规则,这些规则消除了在 URL 中指定“index.php/”的必要性。CodeIgniter 有自己的命令,您可以使用它。
从命令行,在项目的根目录下
php spark serve
将启动一个 Web 服务器,可在端口 8080 上访问。如果您在浏览器中将位置字段设置为 **localhost:8080**,您应该会看到 CodeIgniter 欢迎页面。
现在访问 **localhost:8080/home**。它是否被正确路由到 view()
方法中的 Pages
控制器?太棒了!
您应该看到类似以下内容
您现在可以在浏览器位置字段中尝试几个 URL,以查看您上面创建的 Pages
控制器产生了什么……
URL |
将显示 |
---|---|
localhost:8080/ |
CodeIgniter 的“欢迎”页面。来自 |
localhost:8080/pages |
来自我们 |
localhost:8080/home |
显示您上面创建的“主页”,因为我们明确要求它。来自我们 |
localhost:8080/about |
您上面创建的“关于”页面,因为我们明确要求它。 |
localhost:8080/shop |
一个“404 - 文件未找到”错误页面,因为没有 **app/Views/pages/shop.php**。 |