2016-06-15 4 views
0

현재 Slim 튜토리얼을 따르고 있습니다. $app = Slim::getInstance(); Slim에 대해 잘 모르기 때문에 컨테이너를 사용하는 솔루션이 나에게 적합하지 않습니다. . 아래에 제공된 내 기능을 실제로 실행하려면 어떻게해야합니까? 나는이 점에서 로깅을위한 또 다른 함수 내에서이를 호출하고Slim 3에서 Slim :: getInstance()를 바꾸는 방법

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이며, 박사 나에 대한 설명을 부탁합니다 getInstance()을 사용하는 이전 Slim 코드를 변환하는 방법.

감사합니다.

+0

슬림 3은 서비스 위치를 지원하지 않습니다. json 응답을 반환하고 싶다면 .... $ response-> withJson (); – geggleto

+0

또한 자습서는 Slim 2를 기반으로하는 것으로 보입니다. Slim :: getInstance()는 Slim 3에 존재하지 않습니다. – Wolf

+0

Wolf 그래서 Slim 3으로 변환하는 방법을 묻는 것입니다. –

답변

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에는 싱글 톤 인스턴스를 가져올 정적 메서드가 없습니다. Slim3에서 응답 개체를 연결하려면 middleware을 만드는 것이 가장 좋습니다.

또는 외부 함수에서 $ response에 실제로 액세스하려면 함수 매개 변수 (종속성 주입 패턴을 존중하고 코드를 테스트 할 수 있음)로 전달하십시오 (jsonResponse($response, $error, 500);).

기술적으로 $ app는 전역 변수이지만 $ GLOBALS를 통해 액세스하는 것이 좋습니다.