如何将twig模板引擎集成到没有框架的PHP MVC架构中

时间:2015-06-29 12:36:21

标签: php templates twig

我正在开发一个基于MVC架构(不使用任何框架)的项目,现在工作正常,但问题是如何集成twig php模板引擎。我发布了我的项目的布局结构和我用来加载模板和渲染视图的代码。请查看并建议我将树枝集成到php mvc架构中的正确解决方案,

项目结构

  • PROJECT1

    • 应用
      • 控制器
        • welcome_controllers.php
      • models
      • 的观点
        • 欢迎
          • index.html.twig
        • 模板
          • layout.html.twig
    • 配置
      • Twig(twig文件驻留在这里)
      • router.php 控制器基类

    类控制器{

    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,我希望从中继承控制器的所有视图页面。 如果以前实施过这件事或有任何想法,请有人帮助我。

2 个答案:

答案 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类上使用模板作为参数。

希望这有帮助。