## 视图
简单来说,一个视图其实就是一个 Web 页面,或者页面的一部分,像页头、页脚、侧边栏等,MixPHP的视图支持布局。
## 组件
使用 [composer]([https://www.phpcomposer.com/](https://www.phpcomposer.com/)) 安装:
~~~
composer require mix/view
~~~
## 创建一个视图
功能详解:
- MixPHP 的视图直接使用 PHP 做为引擎。
- 视图文件名全部使用小写,多个单词时,使用下划线分隔,例如:`setting_profile.php`。
- 通过 `$this->name` 可以传递数据到布局文件中使用。
下面演示为控制器 `ProfileController` 创建一个视图,控制器代码如下:
~~~
<?php
namespace App\Web\Controllers;
use App\Common\Helpers\ResponseHelper;
use Mix\Http\Message\Response;
use Mix\Http\Message\ServerRequest;
/**
* Class ProfileController
* @package App\Web\Controllers
* @author liu,jian <coder.keda@gmail.com>
*/
class ProfileController
{
/**
* Index
* @param ServerRequest $request
* @param Response $response
* @return Response
*/
public function index(ServerRequest $request, Response $response)
{
$data = [
'id' => $request->getAttribute('id'),
'name' => '小明',
'age' => 18,
'friends' => ['小红', '小花', '小飞'],
];
return ResponseHelper::view($response, 'profile.index', $data);
}
}
~~~
>[success] views 文件夹存放全部视图文件
先在 `/views/layouts` 目录建立一个布局文件 `main.php`,代码如下:
~~~
<html>
<head>
<title><?= $this->title ?></title>
</head>
<body>
<?= $content ?>
</body>
</html>
~~~
然后在 `/views` 目录创建一个 `profile` 目录,在目录中创建一个 `index.php` 文件,代码如下:
~~~
<?php
$this->title = 'Profile';
?>
<p>id: <?= $id ?>, name: <?= $name ?>, age: <?= $age ?></p>
<p>friends:</p>
<ul>
<?php foreach($friends as $name): ?>
<li><?= $name ?></li>
<?php endforeach; ?>
</ul>
~~~
## 渲染视图
从上面的例子中可看出,视图的渲染是在 `App\Common\Helpers\ResponseHelper::view` 方法中,代码如下:
~~~
<?php
namespace App\Common\Helpers;
use Mix\Helper\JsonHelper;
use Mix\Helper\XmlHelper;
use Mix\Http\Message\Response;
use Mix\Http\Message\Factory\StreamFactory;
use Mix\View\View;
/**
* Class ResponseHelper
* @package App\Common\Helpers
* @author liu,jian <coder.keda@gmail.com>
*/
class ResponseHelper
{
/**
* view
* @param Response $response
* @param string $name
* @param array $data
* @param string $layout
* @return Response
*/
public static function view(Response $response, string $name, array $data = [], string $layout = 'main')
{
$dir = app()->basePath . DIRECTORY_SEPARATOR . 'views';
$view = new View($dir, $layout);
$content = $view->render($name, $data);
return static::html($response, $content);
}
}
~~~
## 渲染视图
从上面的例子中可看出,视图的渲染代码如下:
>[info] $view->render(视图名, 数组);
- 视图名:为视图文件相对路径名,以 `.` 号分隔
- 数组:会传递到对应的视图文件,key为变量名,value为值
## 不使用布局
当有需求不需要使用到布局时:
```
// 不传入 $layout 参数
$view = new View($dir);
// 传入 $layout 的默认参数空字符
$view = new View($dir, '');
```
## 视图嵌套
当你在布局中使用公共的侧边栏等类似的需求时,需要在视图中加载另一个视图,如下:
>[info] 因为视图代码执行在 `Renderer` 对象内部,因此使用 $this 调用自己
- `$__viewdir__` :为当前视图传入视图目录
- `$__data__`:为当前视图传入所有变量的数组,可以让子视图使用父视图的全部变量
新版
~~~
<?= $this->render('子视图名', $__data__); ?>
~~~
旧版
~~~
<?= $this->render($__viewdir__, '子视图名', $__data__); ?>
~~~
- 欢迎使用 MixPHP
- 安装说明
- 全栈开发
- 微服务开发
- Phar 开发
- 如何部署
- 独立部署
- Nginx
- Supervisord
- 新手教程
- 命令行常识
- 进程管理
- 热更新
- 全局变量
- 调试程序
- 入门须知
- 命名空间
- 自动加载
- 入口文件
- 增改应用
- 自动补全 IDE
- 核心功能
- 配置 (manifest.php)
- 依赖注入
- 事件调度
- 验证器
- 验证器定义
- 验证规则
- 静态调用
- 日志 Monolog
- 缓存
- 协程
- 什么是协程
- 开启协程
- Runtime
- 简介
- 创建协程 xgo + Channel
- 创建协程 xgo + WaitGroup
- xgo
- xdefer
- Channel
- WaitGroup
- Timer + Ticker
- Signal
- Select
- Context
- WorkerPool
- 数据库
- Database
- Database
- Connection
- QueryBuilder
- ExecutedEvent
- Redis
- Redis
- Connection
- CalledEvent
- 命令行
- 简介
- Application
- 创建命令
- 命令参数
- 打印与颜色
- 守护进程
- 后台运行
- Web/API 应用
- 简介
- 编写一个接口
- 服务器
- 路由 FastRoute
- 中间件
- 请求
- 响应
- 文件上传
- 控制器
- 视图
- Auth
- Session
- Guzzle
- HTTP 404/500
- 安全建议
- WebSocket 应用
- 简介
- 服务器
- 客户端
- Client
- JavaScript
- Swoole
- nginx代理
- 60s无消息断线
- Micro 微服务
- 简介
- 编写一个微服务
- Mix Micro
- Go Micro
- gRPC
- JSON-RPC
- 服务注册
- 配置中心
- 熔断与降级
- 调用链追踪
- 服务限流
- Sync Invoke 同步调用
- 简介
- 服务器
- 客户端
- TCP 应用
- 简介
- 服务器
- 客户端
- Telnet
- PHP
- Swoole
- UDP 应用
- 简介
- 服务器
- 客户端
- NC
- Swoole
- 第三方接入
- EasyWeChat
- Sentry
- Doctrine Cache
- 常见问题
- 如何利用 CPU 多核
- 连接多个数据库
- 如何设置跨域
- form-data 上传文件失败
- 输出大于 2M 的文件失败