【问题标题】:How to integrate twig template engine into PHP MVC architecture with no framework如何在没有框架的情况下将 Twig 模板引擎集成到 PHP MVC 架构中
【发布时间】:2015-06-29 12:36:21
【问题描述】:

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

项目结构

  • 项目1

    • 应用程序
      • 控制器
        • welcome_controllers.php
      • 型号
      • 查看次数
        • 欢迎
          • index.html.twig
        • 模板
          • layout.html.twig
    • 配置
      • 树枝(树枝文件驻留在此处)
      • 路由器.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,我想从它继承控制器的所有视图页面。 如果之前实施过这个东西或者对此有任何想法,请有人帮助我。

【问题讨论】:

  • MVC 中的视图不仅仅是愚蠢的模板文件。创建一个可以从控制器调用的类或函数,它将设置 Twig 并呈现模板文件。该类/功能/类集是您的视图。这能把事情弄清楚吗?集成到底有什么问题?

标签: php templates twig


【解决方案1】:

不确定如果这是您所要求的,您的问题有点令人困惑,但也许告诉我自己的经验会有所帮助。

我创建了自己的 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_Error_Loader' 并显示消息'看起来你尝试在配置的目录之外加载模板。
  • 完美。首先感谢您的支持。但现在问题是文件系统。正如您所提到的,我必须将所有视图目录添加到文件系统中。有没有办法自动化它,如果我创建数百个控制器,那么视图将包含数百个文件夹到相应的控制器,并且将每个控制器的视图文件夹添加到文件系统中会很乏味。
  • 为每个控制器动态加载文件系统怎么样?类似$loader = new Twig_Loader_Filesystem(array(APP_PATH . '/templates/' . $MyController));
  • 到目前为止,我已经完成了我所要求的一切。我这里还有一个问题。如果我已经使用控制器设置并获取魔术方法,那么我将如何访问我在控制器操作中设置的那些变量。
【解决方案2】:

如果您只是想使用 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 类上使用您的模板。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2018-08-19
    • 2011-11-11
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多