视图
视图只是一个网页,或一个页面片段,比如页眉、页脚、侧边栏等。事实上,如果需要这种层次结构,视图可以灵活地嵌入到其他视图中(在其他视图中,等等)。
视图永远不会被直接调用,它们必须由控制器或 视图路由 加载。
请记住,在 MVC 框架中,控制器充当交通警察,因此它负责获取特定的视图。如果您还没有阅读 控制器 页面,您应该在继续之前阅读。
使用您在控制器页面中创建的示例控制器,让我们向其中添加一个视图。
创建视图
使用您的文本编辑器,创建一个名为 blog_view.php 的文件,并将以下内容放入其中
<html>
<head>
<title>My Blog</title>
</head>
<body>
<h1>Welcome to my Blog!</h1>
</body>
</html>
然后将文件保存到您的 app/Views 目录中。
显示视图
要加载和显示特定的视图文件,您将在控制器中使用以下代码
return view('name');
其中 name 是您的视图文件的名称。
重要
如果省略文件扩展名,则视图应以 **.php** 扩展名结尾。
现在,在 **app/Controllers** 目录中创建一个名为 **Blog.php** 的文件,并将以下内容放入其中
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
return view('blog_view');
}
}
打开位于 **app/Config/Routes.php** 的路由文件,并查找“路由定义”。添加以下代码
use App\Controllers\Blog;
$routes->get('blog', [Blog::class, 'index']);
如果您访问您的网站,您应该会看到您的新视图。URL 类似于以下内容
example.com/index.php/blog/
加载多个视图
CodeIgniter 将智能地处理控制器中对 view()
的多次调用。如果发生多次调用,它们将被附加在一起。例如,您可能希望有一个标题视图、一个菜单视图、一个内容视图和一个页脚视图。这可能看起来像这样
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class Page extends Controller
{
public function index()
{
$data = [
'page_title' => 'Your title',
];
return view('header')
. view('menu')
. view('content', $data)
. view('footer');
}
}
在上面的示例中,我们使用的是“动态添加的数据”,您将在下面看到。
将视图存储在子目录中
如果您希望进行这种类型的组织,您的视图文件也可以存储在子目录中。这样做时,您需要包含加载视图的目录名称。示例
return view('directory_name/file_name');
命名空间视图
您可以在一个名为 **View** 的目录下存储视图,该目录具有命名空间,并像命名空间一样加载该视图。虽然 PHP 不支持从命名空间加载非类文件,但 CodeIgniter 提供了此功能,以便能够以模块化方式将您的视图打包在一起,以便于重复使用或分发。
如果您有一个 **example/blog** 目录,该目录在 自动加载器 下具有 PSR-4 映射设置,位于命名空间 Example\Blog
下,您可以像命名空间一样检索视图文件。
按照此示例,您可以通过在视图名称前添加命名空间来加载 **example/blog/Views** 中的 **blog_view.php** 文件
<?php
return view('Example\Blog\Views\blog_view');
缓存视图
您可以通过在第三个参数中传递一个 cache
选项,以及要缓存视图的秒数,使用 view()
函数缓存视图
// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60]);
默认情况下,视图将使用与视图文件本身相同的名称进行缓存。您可以通过传递 cache_name
和您想要使用的缓存 ID 来自定义它。
// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);
向视图添加动态数据
数据通过 view()
函数的第二个参数中的数组从控制器传递到视图。以下是一个示例
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message',
];
return view('blog_view', $data);
让我们尝试使用您的控制器文件。打开它并添加以下代码
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
$data['title'] = 'My Real Title';
$data['heading'] = 'My Real Heading';
return view('blog_view', $data);
}
}
现在打开您的视图文件,并将文本更改为与数据中数组键相对应的变量
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($heading) ?></h1>
</body>
</html>
然后加载您一直在使用的 URL 上的页面,您应该会看到变量被替换。
saveData 选项
传递进来的数据将保留在后续对 view()
的调用中。如果您在一个请求中多次调用该函数,则无需将所需数据传递给每个 view()
。
但这可能无法阻止任何数据“泄漏”到其他视图中,从而可能导致问题。如果您希望在一次调用后清除数据,可以将 saveData
选项传递到第三个参数中的 $option
数组中。
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message',
];
return view('blog_view', $data, ['saveData' => false]);
此外,如果您希望 view()
函数的默认功能是在调用之间清除数据,您可以在 app/Config/Views.php 中将 $saveData
设置为 false
。
创建循环
传递给视图文件的数据数组不限于简单变量。您可以传递多维数组,这些数组可以循环生成多行。例如,如果您从数据库中提取数据,它通常会以多维数组的形式出现。
以下是一个简单的示例。将其添加到您的控制器中
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
$data = [
'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
'title' => 'My Real Title',
'heading' => 'My Real Heading',
];
return view('blog_view', $data);
}
}
现在打开您的视图文件并创建一个循环
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($heading) ?></h1>
<h2>My Todo List</h2>
<ul>
<?php foreach ($todo_list as $item): ?>
<li><?= esc($item) ?></li>
<?php endforeach ?>
</ul>
</body>
</html>