在每个路由运行之前运行数据库查询

时间:2014-07-22 05:26:18

标签: php slim idiorm

所以我使用Slim Framework,idiorm和twig来构建一个应用程序,并为我的菜单提供一个单独的模板文件,该文件包含在每个页面上。菜单有一个从数据库查询生成的选择菜单,因此需要包含在每个路径中。如何在每条路径上都进行此查询调用而不在每条路径上实际声明它。

我可以使用钩子系统吗?我不知道如何解决这个问题。

我希望这是有道理的。

由于

1 个答案:

答案 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。