所以我使用Slim Framework,idiorm和twig来构建一个应用程序,并为我的菜单提供一个单独的模板文件,该文件包含在每个页面上。菜单有一个从数据库查询生成的选择菜单,因此需要包含在每个路径中。如何在每条路径上都进行此查询调用而不在每条路径上实际声明它。
我可以使用钩子系统吗?我不知道如何解决这个问题。
我希望这是有道理的。
由于
答案 0 :(得分:0)
是的,你是对的,你可以使用带有slim.before.router的钩子,如:
$app->hook('slim.before.router', function() use($app) {
$svc = $app->menuService; // do you use slim ioc?
$menu = $svc->getMenu(); // inject the menu to the app
$app->menu = $menu;
});
您也可以使用中间件
class MyMiddleware extends \Slim\Middleware
{
public function call()
{
$conn = new PDO('mysql:host=localhost;dbname=example', 'username', 'password');
$q = $conn->prepare("SELECT id, key, value FROM menu_items");
$menu = $q->fetch();
$this->app->menu = $menu;
$this->next->call();
}
}
菜单更改的频率如何?在我看来,如果每天不超过两次并且这些只是填充select元素的几个值,那么最好将它放在资源(如json对象)上并直接保存。
否则我宁愿每次执行该会话中的第一个查询时调用该查询,或者将其放在内存数据库中,如redis。