我非常擅长PHP和Slim Framework,它有助于创建API。
一切正常如果我在$app->post
或get
内查询数据库。但我想将它与正常功能分开。当我需要稍后在其他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
之外拨打电话?感谢。
答案 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;
}