首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何替换Slim 3中的Slim::getInstance()

如何替换Slim 3中的Slim::getInstance()
EN

Stack Overflow用户
提问于 2016-06-16 00:58:56
回答 1查看 1.6K关注 0票数 2

我目前正在尝试遵循一个使用$app = Slim::getInstance();的Slim教程,我对Slim不太了解,所以使用容器的解决方案对我来说没有意义。要让下面提供的函数真正运行,我可以做些什么?

代码语言:javascript
复制
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));
}

我在另一个用于登录的函数中调用此函数,如下所示:

代码语言:javascript
复制
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');

我想要一个关于如何转换使用getInstance()的旧超薄代码的解释。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-07-11 04:50:13

实际上,这非常简单。在这种特殊情况下,您根本不需要jsonResponse()函数。您的登录控制器将需要以下更改:

代码语言:javascript
复制
function login($request, $response, $args) {
    // ... some code ...
    if ($isError) {
        return $response->withStatus(500)->withJson($error);
    }
    return $response->withJson($row); // Status=200 is default.
}

一般来说,正如评论中所说,Slim3没有静态方法来获取单例实例。如果您想在Slim3中挂接response对象,最好的方法是创建一个middleware

或者,如果您真的想从外部函数访问$response,可以将其作为函数参数传递(考虑到依赖注入模式并保持代码的可测试性):jsonResponse($response, $error, 500);

从技术上讲,$app是一个全局变量,但我建议不要通过$GLOBALS访问它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37841491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档