如何将 Twig 模板引擎集成到 PHP 没有框架的 MVC 架构中
How to integrate twig template engine into PHP MVC architecture with no framework
我正在做一个基于 MVC 架构(不使用任何框架)的项目,目前工作正常,但问题是如何集成 twig php 模板引擎。我发布了我的项目的布局结构和我用来加载模板和渲染视图的代码。请研究并建议我将树枝集成到 php mvc 架构中的正确解决方案,
项目结构
项目 1
- 应用
- 控制器
- welcome_controllers.php
- 型号
- 观看次数
- 欢迎
- index.html.twig
- 模板
- layout.html.twig
- 配置
- 图书馆
- Twig(树枝文件驻留在此处)
- router.php
控制器底座class
class 控制器 {
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);
}
}
欢迎控制器class
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,我想从中继承控制器的所有视图页面。
如果以前实施过这个东西或者对此有任何想法,请有人帮助我。
不确定如果这就是您要的,您的问题有点令人困惑,但也许说说我自己的经历会有所帮助。
我创建了自己的 MVC 框架,试图复制 Symfony2 的一些最佳功能。我通过使用一些相同的供应商来做到这一点,包括 Twig。
我通过 Composer 安装了 Twig,它会自动生成自动加载器。我集成 Twig 的方法是在我的主控制器的 __construct
中创建一个 loadTwig
方法:
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 = 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 %}
如果你只是想使用 Twig 将数据渲染到你的模板,请注意将 $twig var 传递给你实例化的每个对象的 ___construct class 然后验证它是否正确传递渲染之前。
控制
$objEmployee = new Employee($objConexion->conectar(), $twig);
class
function __construct($l,$q,$t){
$this->link = $l;
$this->query = $q;
$this->twig = $t;
}
在 class
上验证树枝
if (isset($this->twig)){
all print view and render stuff;
}
然后您可以轻松地在每个 PHP class 上使用您的模板,这些模板以 Twig 作为参数实例化。
希望这对您有所帮助。
我正在做一个基于 MVC 架构(不使用任何框架)的项目,目前工作正常,但问题是如何集成 twig php 模板引擎。我发布了我的项目的布局结构和我用来加载模板和渲染视图的代码。请研究并建议我将树枝集成到 php mvc 架构中的正确解决方案,
项目结构
项目 1
- 应用
- 控制器
- welcome_controllers.php
- 型号
- 观看次数
- 欢迎
- index.html.twig
- 模板
- layout.html.twig
- 欢迎
- 控制器
- 配置
- 图书馆
- Twig(树枝文件驻留在此处)
- router.php 控制器底座class
class 控制器 {
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); }
}
- 应用
欢迎控制器class
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,我想从中继承控制器的所有视图页面。 如果以前实施过这个东西或者对此有任何想法,请有人帮助我。
不确定如果这就是您要的,您的问题有点令人困惑,但也许说说我自己的经历会有所帮助。
我创建了自己的 MVC 框架,试图复制 Symfony2 的一些最佳功能。我通过使用一些相同的供应商来做到这一点,包括 Twig。
我通过 Composer 安装了 Twig,它会自动生成自动加载器。我集成 Twig 的方法是在我的主控制器的 __construct
中创建一个 loadTwig
方法:
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 = 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 %}
如果你只是想使用 Twig 将数据渲染到你的模板,请注意将 $twig var 传递给你实例化的每个对象的 ___construct class 然后验证它是否正确传递渲染之前。
控制
$objEmployee = new Employee($objConexion->conectar(), $twig);
class
function __construct($l,$q,$t){
$this->link = $l;
$this->query = $q;
$this->twig = $t;
}
在 class
上验证树枝if (isset($this->twig)){
all print view and render stuff;
}
然后您可以轻松地在每个 PHP class 上使用您的模板,这些模板以 Twig 作为参数实例化。
希望这对您有所帮助。