fiberphp / view
🖼️ FiberPHP 视图引擎 —— 原生 PHP 模板(布局/区块/编译自动转义)+ 可选 Twig 3.0 适配器。
dev-master
2026-09-07 08:45 UTC
Requires
- php: >=8.3
- fiberphp/container: dev-master
- fiberphp/contract: dev-master
Requires (Dev)
- phpunit/phpunit: ^11.0
Suggests
- twig/twig: ^3.0 — 选 'twig' 引擎时需要(composer require twig/twig)
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-07 08:45:29 UTC
README
FiberPHP 视图引擎:原生 PHP 模板(布局继承/区块管理/编译自动转义),可选 Twig 3.0 适配器。
环境要求
- PHP >= 8.3
fiberphp/contract、fiberphp/container(框架核心契约)- 可选
twig/twig ^3.0(选 'twig' 引擎时)
安装
composer require fiberphp/view
选 Twig 引擎时额外安装:
composer require twig/twig:^3.0
目录结构
src/
├── View.php # 视图管理器(静态入口 + 单例引擎)
├── ViewProvider.php # 服务提供者
├── helpers.php # 助手函数 view()
├── Engine/
│ ├── EngineInterface.php # 模板引擎契约
│ ├── PhpEngine.php # 原生 PHP 引擎(布局/区块/编译自动转义)
│ ├── TwigEngine.php # Twig 3.0 适配器
│ └── Compiler.php # {{ }} / {!! !!} 编译器
└── Concern/
├── ManagesLayouts.php # 布局管理 trait
└── ManagesSections.php # 区块管理 trait
配置
config/view.php:
return [
'engine' => 'php', // 'php'(默认)或 'twig'
'paths' => [base_path('resource/views')], // 模板搜索路径
'cache_path' => runtime_path('views'), // 编译缓存目录(null 走系统临时目录)
'compile' => true, // PhpEngine:关闭后 {{ }} 不编译(前端框架冲突场景)
'twig' => [ // Twig 引擎配置
'debug' => false, // 调试模式(关闭自动转义、缓存,开启 strict_variables)
'globals' => [], // 全局模板变量
'filters' => [], // 自定义过滤器 [name => callable]
'functions' => [], // 自定义函数 [name => callable]
],
];
快速开始
基础渲染
use FiberPHP\View\View;
// 渲染模板并返回 HTML 字符串
$html = View::render('home.index', ['title' => 'Hello']);
// 渲染模板并返回 HTTP 响应(需 fiberphp/http)
return View::response('home.index', ['title' => 'Hello']);
助手函数
$html = view('home.index', ['title' => 'Hello']);
原生 PHP 模板(engine=php)
模板文件为原生 PHP,通过 $this 访问引擎方法。
变量输出
<h1><?= $title ?></h1>
<p>Hello, <?= $name ?></p>
编译语法(可选,默认开启)
{{ $var }}— 自动 HTML 转义输出(安全){!! $html !!}— 原样输出(仅限可信内容)- 关闭编译:
view.compile => false(与 Vue 等 {{ }} 框架共存场景)
HTML 转义
<?= $this->escape($userInput) ?>
布局继承
页面模板 page.php:
<?php $this->layout('layout'); ?>
<?php $this->section('title'); ?>页面标题<?php $this->end(); ?>
<div class="content">
<p>页面内容</p>
</div>
布局模板 layout.php:
<!DOCTYPE html>
<html>
<head>
<title><?= $this->yield('title', '默认标题') ?></title>
</head>
<body>
<?= $this->yield('content') ?>
</body>
</html>
模板包含
<div class="sidebar">
<?= $this->include('partials.menu', ['items' => $menu]) ?>
</div>
区块管理
<?php $this->section('sidebar'); ?>
<li>菜单项1</li>
<li>菜单项2</li>
<?php $this->end(); ?>
<?php $this->push('scripts', '<script src="app.js"></script>'); ?>
<?php $this->prepend('sidebar', '<li>首页</li>'); ?>
在布局中输出区块:
<?= $this->yield('sidebar') ?>
<?= $this->yield('scripts') ?>
Twig 模板(engine=twig)
模板名 dot 写法自动转 Twig 路径:home.index → home/index.twig。
基础渲染
{# home/index.twig #}
<h1>{{ title }}</h1>
<p>Hello, {{ name }}</p>
默认开启 HTML 自动转义(autoescape: html),调试模式(view.twig.debug=true)下关闭。
控制结构
{% if user.isAdmin %}
<a href="/admin">后台</a>
{% endif %}
{% for item in items %}
<li>{{ item.name }}</li>
{% endfor %}
包含与继承
{% extends 'layout.twig' %}
{% block title %}页面标题{% endblock %}
{% block content %}
<p>页面内容</p>
{% endblock %}
{{ include('partials.menu.twig', { items: menu }) }}
自定义过滤器/函数
通过 view.twig.filters / view.twig.functions 注册:
// config/view.php
'twig' => [
'filters' => [
'money' => fn($n) => '¥' . number_format($n, 2),
],
'functions' => [
'asset' => fn($path) => '/assets/' . $path,
],
],
模板内使用:
{{ price|money }}
{{ asset('css/app.css') }}
API
View 静态方法
| 方法 | 说明 |
|---|---|
View::render($template, $data) | 渲染模板,返回 HTML 字符串 |
View::response($template, $data, $status) | 渲染模板,返回 HTTP 响应 |
View::engine() | 获取引擎实例(按 view.engine 配置) |
View::setEngine($engine) | 注入自定义引擎(覆盖配置) |
PhpEngine 方法
| 方法 | 说明 |
|---|---|
layout($template) | 设置布局模板 |
section($name) | 开始区块捕获 |
end() | 结束区块捕获 |
yield($name, $default) | 输出区块内容 |
push($name, $content) | 追加内容到区块 |
prepend($name, $content) | 前置内容到区块 |
include($template, $data) | 包含子模板 |
escape($value) | HTML 转义 |
TwigEngine 方法
| 方法 | 说明 |
|---|---|
render($template, $data) | 渲染 Twig 模板(dot 写法自动转路径) |
getEnvironment() | 获取底层 Twig\Environment(扩展配置用) |
测试
composer install
./vendor/bin/phpunit
License
MIT