2016-09-09 2 views
1

저는 첫 번째 API를 만들었으며 Slim PHP를 사용하기로 결정했습니다. 지금까지는 내가 필요로하는 기본 기능을 수행 할 수있는 훌륭한 가벼운 프레임 워크라고 생각합니다. 내가 가진 유일한 문제는 올바른 응답 코드를 반환하지 않는 내 경로 응답이었습니다. 성공적인 로그인시 200을 반환하고 잘못된 자격 증명으로 로그인 실패시 403을 반환하려고합니다. 내가 돌아 오는 것은 그것이 무엇을 반환하든 상관없이 200입니다. 올바른 JSON이 반환되는 것을 볼 수 있기 때문에 논리가 작동하고 있으며 상태 코드가 변경되지 않습니다.Slim PHP 올바른 상태 코드를 반환하지 않습니다.

Index.php는

<?php 
    use \Psr\Http\Message\ServerRequestInterface as Request; 
    use \Psr\Http\Message\ResponseInterface as Response; 

    require 'vendor/autoload.php'; 

    $app = new \Slim\App; 

    $app->options('/{routes:.+}', function ($request, $response, $args) { 
     return $response; 
    }); 

    $app->add(function ($req, $res, $next) { 
     $response = $next($req, $res); 
     return $response 
      ->withHeader('Access-Control-Allow-Origin', 'http://mysite') 
      ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization') 
      ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 
    }); 

    require_once 'api/login.php'; 

    $app->run(); 

Login.php

$app->post('/api/login', function ($request, $response){ 
    require_once 'db.php'; 

    $q = "SELECT * FROM blog_admin WHERE username = ? AND password = ?"; 

    $stmt = $mysqli->prepare($q); 
    $stmt->bind_param('ss', $user, $pass); 

    $user = $request->getParsedBody()['username']; 
    $pass = md5($request->getParsedBody()['password']); 

    if($stmt->execute()){ 
     $stmt->store_result(); 

     if($stmt->num_rows > 0){ 
      $token = md5(uniqid($user, true)); 
      date_default_timezone_set("America/Toronto"); 
      $logged_in = date('Y/m/d'); 
      $data = array(
       "flash" => 'success', 
       "message" => '<strong>SUCCESS:</strong> You have entered the correct login information! Please wait while you are redirected...', 
       '_token' => $token, 
       'logged_in' => $logged_in 
      ); 

      $q = "UPDATE blog_admin SET _token=?, last_logged_in=?"; 
      $stmt = $mysqli->prepare($q); 
      $stmt->bind_param('ss', $token, $logged_in); 

      if($stmt->execute()){ 
       $response->withJson($data, 200); 
      }else{ 
       $data = array(
        "flash" => 'danger', 
        "message" => '<strong>ERROR:</strong> Could not login! Please try again later!' 
       ); 
       $response->withJson($data, 403); 
      } 
     }else{ 
      $data = array(
       "flash" => 'danger', 
       "message" => '<strong>ERROR:</strong> The Username/Password you have entered is incorrect. Please try again.' 
      ); 
      $response->withJson($data, 403); 
     } 
    }else{ 
     $data = array(
      "flash" => 'danger', 
      "message" => '<strong>ERROR:</strong> Could Not Run the SQL' 
     ); 

     $response->withJson($data, 500); 
    } 

    return $response; 
}); 

내가 지금 어떤 아이디어가 많이 주시면 감사합니다, 문제가 될 일을 모르겠어요.

답변

3

slim3이 사용하는 PSR-7 Response는 immutable value object이므로 변경할 수 없습니다.

F.ex.

$response->withJson($data, 200); 

는이

return $response->withJson($data, 200); 

을 반환해야 하나 그래서이 변경된 응답을 반환 $response 변경되지 않습니다하거나 새 값으로 변수를 할당 한 다음의 말을 반환해야 경로 기능.

$response = $response->withJson($data, 200); 
// other code 
return $response; 
관련 문제