jakesee / slim-template-response
一个Slim框架的插件,允许延迟解析和渲染模板,以便可以检查或修改模板数据。
1.0.1
2017-11-23 15:41 UTC
Requires
- php: >=5.6.4
- slim/slim: ^3.8
Requires (Dev)
- phpunit/phpunit: ^5.7
This package is not auto-updated.
Last update: 2024-09-29 04:37:11 UTC
README
这是一个Slim框架的插件,允许延迟解析和渲染模板,以便可以检查或修改模板数据。
安装
composer require jakesee/slim-template-response ^1.0.1
详细说明
由于Slim框架的设计方式,Slim框架推荐的模板引擎都会在控制器中直接将数据写入ResponseInterface流,因此,在控制器退出后(例如在出站中间件路径中),无法检查或修改模板数据变量。因此,这个Slim-Template-Response插件添加了一种简单的方法,可以在最终将数据写入流之前保存模板变量。
不修改Slim的工作方式,我们可以使用以下方法来延迟写入:
$app->respond($app->run(true)->render());
代替以下内容:
$app->run();
中间件
因此,您可以在控制器退出后的任何中间件中修改模板变量。
class MyMiddleware
{
function __invoke($request, $response, $next)
{
// incoming loop
...
// call the next middleware
$response = $next($request, $response);
// controller is called eventually and returns:
// return $response->withTemplate(...);
// outgoing loop, modify template data
$response->getTemplate()->data['total'] = 50;
return $response;
}
}
单元测试
在单元测试中,您现在也可以通过检查数据变量来直接测试结果。
function testDisplayTotal()
{
// setup ...
// Run Slim App
$response = $app($request, $response);
// Get the template data
$data = $response->getTemplate()->data;
$this->assertEquals(50, $data['total']);
}
用法
此插件由一个Response类(它扩展了Slim Response类)和一个Template类组成。只需将Response类注入到依赖容器中,以便Slim App将使用我们的扩展Response类。
$app = new \Slim\App(); // default Slim Response is initialized by this constructor
$container = $app->getContainer();
// We just replace the Response object by injecting our extended Response into the container
$container['response'] = function($container) {
// This is how Slim sets up the default Response object in vendor/slim/slim/Slim/DefaultServicesProvide.php.
// We simply replicate it here as closely as possible.
$headers = new \Slim\Http\Headers(['Content-Type' => 'text/html; charset=UTF-8']);
$template = new \Braincase\Slim\Template($container, __DIR__ . '/../resources/views/');
$response = new \Braincase\Slim\Response($template, 200, $headers);
return $response->withProtocolVersion($container->get('settings')['httpVersion']);
};
// create a route
$app->get('/test', function($request, $response) {
$response->withTemplate('default.php', [
'firstName' => 'Jake',
'lastName' => 'See'
]);
});
Template类使用纯PHP进行模板化,没有像Twig或Blade这样的高级功能,但只要您的Template类实现了TemplateInterface,就可以使用您自己的Template类。
兼容性
截至目前,此插件与Slim Framework 3兼容。即将推出Slim Framework 4,但我尚未对其新版本进行测试。