基本模板Twig

时间:2015-08-20 02:36:06

标签: templates twig slim

我有多个扩展我的base模板的模板。我的问题是,基础模板是否可以从数据库中执行数据?我正在使用纤薄的框架顺便说一句。这就是我用slim来渲染模板的方法:

$app->get('/', function () use ($app) {
    $app->render('index.html');
});

现在,我想说的是这样的: enter image description here

正如您在div loadedData中看到的那样,数据来自数据库。但问题是,它是base template。它怎么能得到这样的数据?提前谢谢。

1 个答案:

答案 0 :(得分:1)

您正在寻找的是在模板中注册全局变量,因此即使基本模板也可以访问它,而无需您每次都手动粘贴它。

自定义中间件

您需要编写自己的(非常简单的)中间件。它看起来像这样:

class GlobalTwigVars extends \Slim\Middleware
{
    public function call()
    {
        $conn = ???; // somehow get your database connection
        $this->app->view['my_data'] = $conn->query(...)->fetchAll();
        $this->next->call(); // VERY IMPORTANT
    }
}

这个中间件将在请求开始后和控制器执行之前的某个时间被调用。它添加了一个全局变量my_data,其中包含您的查询结果(the Twig class supports ArrayAccess for setting global variables)。

使用Slim

注册中间件

这非常简单,只需在初始化文件中的某处添加:

$app = new Slim\Slim;
// blah blah
$app->add(new GlobalTwigVars);

$app->get('/something', function() { /* ... */ });

在模板中

现在您所要做的就是遍历模板中的数据。与截图中的操作不同,您需要使用Twig语法,而不是原始PHP。例如:

<ul>
    {% for row in my_data %}
    <li>{{ row.name }}</li>
    {% endfor %}
</ul>

注意:此方法将针对每个请求执行您的查询,这可能不是您想要的。随意在中间件中添加一些条件逻辑,以避免不必要的查询。