我目前正在尝试使用利用$app = Slim::getInstance();
的Slim教程我对Slim知之甚少,所以使用容器的解决方案对我来说没有意义。我可以做些什么来使下面提供的功能实际运行?
function jsonResponse($data, $code = 200)
{
$app = Slim::getInstance();
$app->response->setStatus($code);
$app->response->headers->set(
'Content-type',
'application/json; charset=utf-8'
);
return $app->response->setBody(json_encode($data));
}
我在另一个登录的函数中调用它,如下所示:
function login($request) {
$user = json_decode($request->getBody());
$username = $user->username;
$password = $user->password;
if (empty($username) || empty($password)) {
$error = 'Username and password are required';
// Bad request
return jsonResponse($error, 400);
}
$sql = "SELECT first_name, username FROM users "
. "WHERE username = '$username' AND password = '$password'";
$db = getConnection();
$row = array();
try {
$result = $db->query($sql);
if (!$result) {
$error = 'Invalid query: ' . mysql_error();
// Internal server error
return jsonResponse($error, 500);
}
$user = $result->fetchAll(PDO::FETCH_OBJ);
if (empty($user)) {
// Unauthorized
return jsonResponse($error, 401);
}
$row["user"] = $user;
$db = null;
} catch(PDOException $e) {
error_log('{"error":{"text":'. $e->getMessage() .'}}');
// $error = array( 'error' => array ( 'text' => $e->getMessage() ) );
// Internal server error
return jsonResponse($error, 500);
}
// OK, default is 200
return jsonResponse($row);
}
登录功能的路线是$app->post('/login_user', 'login');
tl; dr我想解释如何转换使用getInstance()
的旧Slim代码。
谢谢!
答案 0 :(得分:0)
实际上非常简单。在这种特殊情况下,您根本不需要jsonResponse()
功能。您的登录控制器将需要这些更改:
function login($request, $response, $args) {
// ... some code ...
if ($isError) {
return $response->withStatus(500)->withJson($error);
}
return $response->withJson($row); // Status=200 is default.
}
通常,正如在评论中所说的那样,Slim3没有静态方法来获取Singleton实例。如果你想在Slim3中挂钩响应对象,最好的方法是创建一个middleware。
或者,如果您真的想从外部函数访问$ response,则将其作为函数参数传递(尊重依赖注入模式并保持代码可测试):jsonResponse($response, $error, 500);
。
从技术上讲,$ app是一个全局变量,但我建议不要通过$ GLOBALS访问它。