## 视图 简单来说,一个视图其实就是一个 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__); ?> ~~~