所以我使用 Slim 框架、idiorm 和 twig 来构建一个应用程序,并为我的菜单提供一个单独的模板文件,该文件包含在每个页面上。该菜单有一个从数据库查询生成的选择菜单,因此需要包含在每条路线中。我怎样才能在每条路线上都有这个查询调用,而不是在每条路线上实际声明它。
我可以使用挂钩系统吗?我不知道如何解决这个问题。
我希望这是有道理的。
谢谢
是的,您是对的,您可以将 hook 与 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();
}
}
菜单多久更换一次?在我看来,如果每天不超过两次并且这些只是填充选择元素的几个值,那么最好将它放在资源上(如 json 对象)并直接保存。
否则,我宁愿在每次执行该会话中的第一个查询时调用该查询,或者将其放在内存数据库(如 redis)上。