如何在Slim 3

时间:2016-06-15 16:58:56

标签: php slim

我目前正在尝试使用利用$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代码。

谢谢!

1 个答案:

答案 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访问它。