티스토리 뷰

Language/PHP

PHP. Router 만들기

out of coding 2020. 8. 8. 20:14

이런 방법을 쓰지 말고 CodeIgniter 같은것을 사용하면 자동으로 해주므로 이것을 사용해도 됩니다.

 

CodeIgniter Web Framework

The latest is Version v4.0.4

codeigniter.com

그렇지만 저는 기본적으로 사용할 route 방법을 만들어 봄으로써 기본적인 프레임워크의 방향을 만들어 보려고 했습니다.

1. Router.php

<?php

require_once DOCUMENT_ROOT().'/controller/ErrorController.php';

class Router {

    private static $instance;

    public static function get() {
        if (null === static::$instance) {
            static::$instance = new Router();
        }

        return static::$instance;
    }

    public function route() {
        $request_uri = $_SERVER['REQUEST_URI'];
        $request_path = parse_url($request_uri, PHP_URL_PATH);
        $paths = explode("/", $request_path);
        $count = count($paths);

        $last = $paths[$count - 1];
        $result = $this->call_controller($last, '');

        if (!$result) {
            $result = $this->call_controller($paths[$count - 2], $last);
        }

        if (!$result) {
            $error = new ErrorController();
            $error->print_404();
        }
    }

    public function call_controller($class, $params) {
        try {
            $request_method = strtolower($_SERVER['REQUEST_METHOD']);
            $controller = ucfirst($class).'Controller';
            $file_path = DOCUMENT_ROOT().'/controller/'.$controller.'.php';
            if (file_exists($file_path)) {
                require_once $file_path;
                $target = new $controller();
                call_user_func_array(array($target, $request_method), array($params));
                return true;
            }
        } catch (Error $e) {}

        return false;
    }
}

중요 부분들만 설명을 드리겠습니다.

 

DOCUMENT_ROOT() ?

function DOCUMENT_ROOT() {
    $root = $_SERVER["DOCUMENT_ROOT"].'/app';

    if ($_SERVER['SERVER_NAME'] != 'localhost') {
        return $_SERVER["DOCUMENT_ROOT"];
    }

    return $root;
}

index.php에 위와 같은 부분을 넣어주어서 localhost에서 테스트할때와 docker를 이용한 원격지 업로드시에 path를 따로 가지고 오도록 하였습니다.

 

get() method

single instance로 동작할수 있도록 하였습니다.

 

route() method

route는 index.php에서 호출하게 만들어 두었고요.

route에서 request_uri의 값을 가져와서 어떠한 endpoint를 호출하여서 사용하려고 하는지 확인합니다.

저는 정말 간단하게 만들거라 path의 마지막값과 마지막값의 바로 전의 값만 비교하여서 Controller의 값을 가지고 있는 것들을 호출할수 있도록 하였습니다.

 

어떠한 path까지 가능한가?

/index.php/blabra/1
/index.php/blabra/
/index.php/blabra

이러한 형태까지는 됩니다. 물론 BlabraController.php 파일은 만들어두어야 합니다.

Controller를 가져오지 못한다면? 404에러를 표현하여 줍니다.

 

call_controller() method

request method를 통해서 get post 등의 method를 호출합니다.

file이 exists할 경우에 require_once로 불러와서 컨트롤러를 생성하고 call_user_func_array로 params도 호출하게 됩니다.

2. HelloController.php

URI가 /.../hello로 들어오게 되면 다음의 컨트롤러를 호출하게 됩니다.

<?php

require_once 'BaseController.php';

class HelloController extends BaseController {

    function get() {
        echo 'Hello, push-service!';
    }
}

3. ErrorController.php

<?php

require_once 'BaseController.php';

class ErrorController extends BaseController {

    function print_404() {
        http_response_code(404);
        echo '404 Not Found';
        exit;
    }
}

php는 정말 간단하게 빠르게 만들수 있는거 같습니다.

'Language > PHP' 카테고리의 다른 글

php. redirection 리다이렉션 만들기  (0) 2020.03.13
PHP로 APNS 구현하기  (0) 2018.05.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함