-1

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

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

我希望这是有道理的。

谢谢

4

1 回答 1

0

是的,您是对的,您可以将 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)上。

于 2014-07-23T02:02:10.490 回答