我正在开发一个基于MVC架构(不使用任何框架)的项目,现在工作正常,但问题是如何集成twig php模板引擎。我发布了我的项目的布局结构和我用来加载模板和渲染视图的代码。请查看并建议我将树枝集成到php mvc架构中的正确解决方案,
项目结构
PROJECT1
类控制器{
var $twig = null;
public function loadTwig() {
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem(
array (APP_PATH.'/views/')
);
// set up environment
$params = array(
'cache' => BASE_PATH.'/cache',
'auto_reload' => true, // disable cache
'autoescape' => true
);
$this->twig = new Twig_Environment($loader, $params);
}
}
WelcomeController类
class WelcomeController extends AppController{
public function index(){
$this->loadTwig();
$this->twig->render('welcome/index.html.twig');
}
}
index.html.twig文件
{% extends '../templates/layout.html.twig' %}
{% block title %}
Index Page Title
{% endblock %}
layout.html.twig文件
<html>
<head>
<title>{% block title %}{% endblock %} - My Webpage</title>
</head>
<body>
base template text
</body>
</html>
现在,我在views / templates文件夹中定义了模板layout.html.php,我希望从中继承控制器的所有视图页面。 如果以前实施过这件事或有任何想法,请有人帮助我。
答案 0 :(得分:1)
不确定如果这是你要求的,你的问题有点令人困惑,但也许告诉我自己的经验会有所帮助。
我创建了自己的MVC框架,试图复制Symfony2的一些最佳功能。我是通过使用一些相同的供应商来实现的,包括Twig。
我通过Composer安装了Twig,自动生成了自动加载器。我正在整合Twig的方法是在我的主控制器的loadTwig
内创建一个__construct
方法:
public function loadTwig() {
$loader = new Twig_Loader_Filesystem(
array (
"../html/views",
"../html/widgets"
)
);
// set up environment
$params = array(
'cache' => "../cache",
'auto_reload' => true, // disable cache
'autoescape' => true
);
$this->twig = new Twig_Environment($loader, $params);
// ...
}
然后,每当我需要渲染位于“views”或“widgets”文件夹内的模板时,我只需要调用:
$this->twig->display('myview.html.twig', array('foo' => 'bar'));
希望这有帮助!
修改强>
twig loader文件系统加载你定义的目录内同一级别的每个模板(不确定它是递归加载文件还是只是在目录的根目录上加载文件,你可以试试这个)。这意味着您在渲染,扩展或包含其他树枝模板时无需定义路径。模板只是加载并存在于同一级别。请尝试以下方法:
Filesystem Loader:
$loader = new Twig_Loader_Filesystem(
// array (APP_PATH.'/views/') you may try if this work, but:
array (
APP_PATH.'views/templates',
APP_PATH.'views/welcome'
APP_PATH.'views/foo'
APP_PATH.'views/bar'
)
);
渲染(使用显示而不是渲染):
$this->twig->display('index.welcome.html.twig', array('foo' => 'bar')); // if you have more than one index.html.twig, rename your templates :)
模板:
{% extends 'layout.html.twig' %}
{% block title %}
Index Page Title
{% endblock %}
答案 1 :(得分:0)
如果您只是想使用Twig将数据渲染到模板中,请注意将$ twig var传递给您实例化的每个对象类的___construct,然后验证它在渲染之前是否正常通过。
<强>控制强>
$objEmployee = new Employee($objConexion->conectar(), $twig);
<强>类强>
function __construct($l,$q,$t){
$this->link = $l;
$this->query = $q;
$this->twig = $t;
}
验证课堂上的小枝
if (isset($this->twig)){
all print view and render stuff;
}
然后,您可以轻松地在每个使用Twig实例化的PHP类上使用模板作为参数。
希望这有帮助。