我有多个扩展我的base
模板的模板。我的问题是,基础模板是否可以从数据库中执行数据?我正在使用纤薄的框架顺便说一句。这就是我用slim来渲染模板的方法:
$app->get('/', function () use ($app) {
$app->render('index.html');
});
正如您在div loadedData
中看到的那样,数据来自数据库。但问题是,它是base template
。它怎么能得到这样的数据?提前谢谢。
答案 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)。
这非常简单,只需在初始化文件中的某处添加:
$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>
注意:此方法将针对每个请求执行您的查询,这可能不是您想要的。随意在中间件中添加一些条件逻辑,以避免不必要的查询。