Slim Framework - 如何在正常函数中查询db

时间:2017-02-17 15:55:14

标签: php api slim

我非常擅长PHP和Slim Framework,它有助于创建API。 一切正常如果我在$app->postget内查询数据库。但我想将它与正常功能分开。当我需要稍后在其他API中使用它时,它会有所帮助。

我试着打电话给这个

$app->get('/search/[{phone}]', function($request, $response, $args) use ($app){
    $token = $response->getHeader('token');
    // $phone = $args['phone'];
    if (isTokenValid($token)){
        return $this->response->withJson("valid");
    }
    return $this->response->withJson("invalid");

});

我的isTokenValid()功能

function isTokenValid($token){
    $sql = 'SELECT id FROM users WHERE token = :token';
    $s = $app->db->prepare($sql); //<< this line 25
    $s->bindParam(':token', $token);
    if ($s->execute()){
        if($sth->rowCount() > 0){
            return true;
        }
    }
    return false;
}

但我得到500 Internal Server Error

Type: Error
Message: Call to a member function prepare() on null
File: /Applications/MAMP/htdocs/aigoido/src/functions.php
Line: 25

如何在$app之外拨打电话?感谢。

2 个答案:

答案 0 :(得分:1)

您希望为数据库连接创建依赖项注入容器,并将该对象作为函数参数而不是app对象传递。这使得db连接可以在整个应用程序中重复使用。

https://www.slimframework.com/docs/concepts/di.html

此外,您可以返回$ response而不是$ this-&gt;响应。

$c = $app->getContainer();

$c['db'] = function() {
    return new DB($host,$user,$pass,$name);
};

$app->post('/search/[{phone}]', function($request, $response, $args) use ($c) {
     $token = $response->getHeader('token');
    // $phone = $args['phone'];
    if (isTokenValid($c->db,$token)){
        return $response->withJson("valid");
    }
    return $response->withJson("invalid");    
});


function isTokenValid($db, $token){
    $sql = 'SELECT id FROM users WHERE token = :token';
    $s = $db->prepare($sql);
    $s->bindParam(':token', $token);
    if ($s->execute()){
        if($sth->rowCount() > 0){
            return true;
        }
    }
    return false;
}

答案 1 :(得分:0)

$app作为参数传递给您的函数。该函数具有自己的上下文,因此没有它就没有$ app。

function isTokenValid($token, $app){
    $sql = 'SELECT id FROM users WHERE token = :token';
    $s = $app->db->prepare($sql); //<< this line 25
    $s->bindParam(':token', $token);
    if ($s->execute()){
        if($sth->rowCount() > 0){
            return true;
        }
    }
    return false;
}