Phalcon 3.4.5任务中调用Volt视图及解决stylesheet_link报错
在Phalcon 3.4.5任务中使用Volt视图生成HTML的问题
我在开发项目中需要通过Phalcon任务运行Volt视图,生成对应的HTML代码,并且要在渲染视图前传递参数。但没找到相关实现方案,想请教:能否在Phalcon任务中使用Volt视图?
PS:当前使用Phalcon 3.4.5版本
初始尝试代码及报错
我尝试了以下代码:
public class TestTask { public function mainAction() { $diViews = $this->getDI()->get("view"); $diViewsBackend->start(); $diViewsBackend->setRenderLevel(\Phalcon\Mvc\View::LEVEL_ACTION_VIEW); $diViewsBackend->render("test", 'test', $dataForReport); $diViewsBackend->finish(); echo $diViewsBackend->getContent(); } }
但Volt视图中使用stylesheet_link函数时,出现如下报错:
PHP Fatal error: Uncaught Error: Call to a member function stylesheetLink() on null
3月20日更新内容
注册的视图服务
$di->set( 'viewGvReport', function () { $viewGvReport = new \Phalcon\Mvc\View\Simple(); $viewGvReport->setViewsDir(__DIR__ . '/views/'); $viewGvReport->registerEngines( array( ".volt" => function ($view, $di) { $volt = new Volt($view, $di); $compiler = $volt->getCompiler(); $compiler->addFunction('ucfirst', function($params) { return "mb_strtoupper( mb_substr( $params, 0, 1 )) . mb_substr( $params, 1 )"; }); $compiler->addFunction('stylesheetLink', function($parameters, $local) { return null; return \Phalcon\Tag::stylesheetLink($parameters, $local); }); return $volt; } ) ); return $viewGvReport; }, true );
任务中调用视图的代码
$html = $this->view->render( "controller", "view", [] );
Volt视图代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> {{ stylesheet_link('https://fonts.googleapis.com/css?family=Barlow+Semi+Condensed:200,200i,400,500&subset=latin-ext') }} {{ stylesheet_link('assets2/css/report.min.css?version=2.9.4') }} <title>Report</title> </head> <body> <!-- content body with some expected parameters --> </body> </html>
解决方案
问题主要出在服务匹配、自定义函数逻辑以及视图调用方式上,修正步骤如下:
- 匹配正确的视图服务
你注册的视图服务名称是viewGvReport,但任务中调用的是$this->view,二者不匹配,需要修改任务中的调用代码:
$html = $this->getDI()->get('viewGvReport')->render("controller", "view", []);
- 修复
stylesheetLink函数逻辑
自定义函数里先返回null的代码会直接阻断正常渲染,需要删除;同时确保Phalcon\Tag能正常调用,可修改为:
$compiler->addFunction('stylesheetLink', function($parameters, $local) use ($di) { return \Phalcon\Tag::stylesheetLink($parameters, $local); });
更简便的方式是直接使用Volt内置的tag服务,无需自定义函数,只要DI中已注册tag服务(Phalcon项目默认会注册),视图代码可改为:
{{ tag.stylesheetLink('https://fonts.googleapis.com/css?family=Barlow+Semi+Condensed:200,200i,400,500&subset=latin-ext') }} {{ tag.stylesheetLink('assets2/css/report.min.css?version=2.9.4') }}
- 正确传递参数
如果需要向视图传参,直接将数据数组传入render方法的第三个参数即可:
$data = [ 'title' => '自定义报告标题', 'content' => '报告内容' ]; $html = $this->getDI()->get('viewGvReport')->render("controller", "view", $data);
在Volt视图中就能通过{{ title }}、{{ content }}直接访问参数。
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

