인프런 커뮤니티 질문&답변

이대원님의 프로필 이미지
이대원

작성한 질문수

PHP 7+ 프로그래밍

63 - 함수 (Functions; Functions) (2)

$_GET과 $_POST를 구별하여야한다고 하는데 이건 왜 $_GET입니까 콜백이라서 그런가요? 왜콜백은 그래도 되나요?

작성

·

378

0

function routes($routes)
{
    foreach ($routes as [ $path, $method, $callbackString ]) {
        [ $file, $callback ] = explode('.', $callbackString);
        if (match($path, $method)) {
            require_once dirname(__DIR__, 2) . "/app/controllers/{$file}.php";
            call_user_func($callback, ...array_values($_GET));
            return true;
        }
    }
    return false;
}

답변 1

1

정상우님의 프로필 이미지
정상우
지식공유자

콜백에 $_GET 을 넘긴 것은 단순하게 URL 을 통해 Query String 으로 넘어온 값을 함수 파라미터로 넘기기 위함입니다. 요청방식이 GET 이든 POST 든 요청할 때 쿼리 스트링을 포함시킬 수 있습니다. 이는 질문내용인

$_GET과 $_POST를 구별하여야한다고 하는데 이건 왜 $_GET입니까 콜백이라서 그런가요? 왜콜백은 그래도 되나요?

라는 것과는 달리 콜백인지 아닌지는 전혀 관련성이 없습니다. POST 의 경우 어차피 컨트롤러 내부에서 INPUT_POST 로 접근하는 식으로 작성됩니다.

/**
 * @param callback $callback
 * @param int $id
 *
 * @return bool|void
 */
function base($callback, $id = null)
{
    $args = filter_input_array(INPUT_POST, [
        'title'     => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
        'content'   => FILTER_DEFAULT
    ]);
    if ($id) {
        $post = first("SELECT * FROM posts WHERE id = ?", filter_var($id, FILTER_VALIDATE_INT));
        if (empty($post)) {
            return reject(404);
        }
    }
    return call_user_func($callback, $post ?? [], $args) ?: reject();
}

이를테면 이 강의에서 글 읽기 접근 (GET) 은 ?id=1 과 같이 쿼리스트링이 붙고, POST 로 수정이나 삭제를 처리할 때도 마찬가지로 쿼리스트링이 붙습니다. REST API 에서 URL 파라미터로 접근하는 것을 쿼리 스트링으로 대체했을 뿐입니다. 따라서 GET, POST 에 관계없이 쿼리 스트링이 요구됩니다. 쿼리 스트링이 아닌 URL 파라미터를 사용하는 구현은 이 강의가 아닌 객체지향 강의에서 진행합니다.

이 강의에 쓰인 예제코드는 https://github.com/php-courses-inflearn/php7 에서 확인하실 수 있습니다.

 

이대원님의 프로필 이미지
이대원
질문자

감사합니다

이대원님의 프로필 이미지
이대원

작성한 질문수

질문하기