coreorm / slim3-view
slim3 的视图渲染器,具有非常直接和简单(但仍然可定制)的主题/布局/模板结构
Requires
- php: >=5.6
- psr/http-message: ^1.0
Requires (Dev)
- phpunit/phpunit: ^4.8
- slim/slim: ^3.0
This package is not auto-updated.
Last update: 2024-09-28 19:52:45 UTC
README
slim3 的视图渲染器,具有非常直接和简单(但仍然可定制)的主题/布局/模板结构。
这也适用于任何符合 PSR-7 规范的响应对象。
示例
要求
- php 5.6+
- composer
安装
composer require coreorm/slim3-view
测试
phpunit
结构
确保您的主题目录结构如下
themes
├── default
│ └── layouts
│ └── default.phtml
├── theme 1
│ ├── layouts
│ │ └── main.phtml
│ └── views
│ └── index.phtml
...
- 布局:布局文件应放置在
<theme name>/layouts/
目录。 - 注意,如果没有找到自定义布局,建议使用默认布局,它将回退到默认布局。
- 视图:视图必须位于 views 下,但可以位于嵌套目录中,在需要渲染时,只需使用相对于 views 的相对路径即可,例如,如果您有
views/foo/bar.phtml
,只需调用$theme->render($response, 'foo/bar')
布局模板
布局模板必须在主体中包含默认变量 $mainContent
,以便子模板可以出现,例如。
# file: themes/default/layouts/default.phtml
...
<body><?php echo $mainContent; ?></body>
...
另一种将渲染的内容发送到页面的方法是使用 $theme->renderView()
,例如。
# in route
$theme->setData('myHeader', $theme->renderView('shared/header'));
# in layout
...
<head>
echo $myHeader
</head>
...
使用示例(或只需打开 examples/app/index.php)
- 与 slim 一起使用
use \Coreorm\Slim3\Theme;
$app = new Slim\App();
$theme = Theme::instance(__DIR__ . '/../themes', 'example');
// set layout
$theme->setLayout('main')->setData('title', 'Slim 3 View Example');
$app->get('/', function ($request, $response, $args) use ($theme) {
return $theme->render($response, 'index', [
'foo' => 'bar'
]);
});
$app->run();
- 与其它符合 PSR-7 规范的库一起使用
$response = new Response();
$response = Theme::instance('theme-base-dir', 'theme-name')->render($response, 'template-name', [data array]);
echo $response->getBody();
APIs
主题 API
Theme::instance($templatePath = null, $theme = 'default')
实例化主题类:我们使用单例模式确保所有共享数据对每个模板都可用,因此只需使用
use \Coreorm\Slim3\Theme;
$theme = Theme::instance('theme base directory', 'layout name');
$theme->setLayout($layout)
切换布局:可以在代码的开始或运行时在路由中切换布局。
$theme->setLayout('layout name');
例如。
$app->get('/', function ($request, $response, $args) use ($theme) {
$theme->setLayout('new-layout');
return $theme->render($response, 'index', [
'foo' => 'bar'
]);
});
$theme->setTheme($theme)
切换主题:这将设置当前主题为 $theme
的字符串值。
$theme->share($templateRelativePath, $theme)
标记特定主题的模板为可共享:这将使其成为一个全局模板,在找不到不同主题中具有相同名称的模板时使用。
$templateRelativePath
模板的相对路径$theme
主题名称
例如。
$theme->share('views/page1', 'default');
这将标记页面 themes/default/views/page1.phtml
为相对路径 views/page1
的共享视图,因此如果我在主题 'new' 中,调用 renderView('page1')
,如果 themes/new/views/page1.phtml
不存在,它将使用 themes/default/views/page1.phtml
代替。
$theme->render(ResponseInterface $response, $template, array $data = [], $shouldFallback = false)
渲染模板及布局:这是您想在路由/控制器中运行的最终渲染函数,因为它渲染了给定的模板并将其分配给 $mainContent
部分数据,然后将其显示在模板的主要主体(或您想显示的地方,通过调用 <?php echo $mainContent; ?>
)中。因此,它渲染模板,然后布局,然后输出到浏览器。
$shouldFallback
- 当此设置为 true 时,系统将尝试找到回退模板,如果找不到给定的模板(有关详细信息,请参阅上面的share
API)。
例如。
$theme->render($response, 'relative path/template name', [partial data], true);
$theme->renderView($template, $data = [], $shouldFallback = true, $reuseHTML = false)
渲染模板并获取内容:这将渲染模板并返回 html。
$reuseHTML
如果设置为true,则给定模板将只渲染一次,并且对同一模板的任何后续的 renderView/import 调用都将重用从第一次渲染生成的HTML。适用于页面中重复出现且具有完全相同HTML源代码的元素。
例如。
$viewSrcHTML = $theme->renderView('relative path/template name', [partial data]);
模板(布局/视图)API
$this->import($templateFile, $data = [], $shouldFallback = true, $reuseHTML = false)
在模板内部导入子模板 这只在模板内部可用。
在模板代码中,执行
$this->import('relative path/template name', [partial data]);
数据范围
全局(对所有模板都可用)
$theme->setData($k, $v)
设置对所有模板/布局都有效的数据;
私有(部分数据将覆盖全局数据,当用于渲染单个视图时使用)
将部分数据传递给render/import函数将仅设置给定模板的私有数据。例如,$theme->render($response, 'page', ['foo' => 'bar'])
将仅将 $foo 的值设置为 'bar' 用于 page
模板。