CodeIgniter3

17. [CodeIgniter3] URL 라우팅 & CRUD-Blog 예제

drizzle0925 2022. 1. 4. 15:10
728x90

CodeIgniter에서 경로의 기능은 URL을 단순화하고 콘텐츠를 알아보게 쉽게 하는 URL 기능을 제공합니다.

 

예시

경로는 base_url 또는 index_url 뒤에 설정되며 특정 페이지로의 라우팅을 위해 생성된 컨트롤러 및 메서드가 포함됩니다.

www.domain.com/main/home
www.domain.com/main/about
www.domain.com/main/contact
www.domain.com/main/login
www.domain.com/main/register

 

어떻게 작동하는가?

브라우저 URL에서 라우팅 구조는 다음과 같습니다.

domain.com/Controller/Method/Parameter/

위의 URL 예제에서 Controller는 개발 중에 만들어진 컨트롤러(클래스)의 이름, 즉 컨트롤러의 폴더에 정의된 컨트롤러(Controller)를 가리키고 컨트롤러 이름을 URL에 바인딩합니다.

그다음 컨트롤러 내부에 정의된 메서드(Method)가 호출되고 요청된 URL에 응답하도록 바인딩됩니다.

경로에 대한 매개변수는 메서드/함수를 만드는 동안 전달된 매개변수에 따라 달라지므로 선택사항입니다.

**URL에 해당하는 메소드/함수 대신 다른 클래스 메소드/함수 호출 가능**

 

예시

localhost/user/delete/2

User = Controller
Delete = User Controller 안에 있는 Method
2 = Method에 전달된 Parameter

 

라우터 설정하기

application/controllers에 컨트롤러 이름과 파일이름을 동일하게 설정합니다.

 

Controller

application/controllers/Main.php 파일을 생성하고 아래 코드를 입력합니다.

<?php 
class Main extends CI_Controller
{
    public function home()
    {
        $this->load->view('home');
    }
}
?>

 

View

application/views/home.php 파일을 생성하고 아래 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home View</title>
</head>
<body>
    <h1>Home View Page</h1>
</body>
</html>

 

아래 URL로 접속합니다

localhost/main/home

일치하는 경로가 없으면 CodeIgniter는 예외 404 Page not found를 발생시킵니다.

 

경로 사용

id 가져오기와 함께 모든 라우팅 경로를 포함하는 복잡한 URL을 사용하여 대규모 애플리케이션을 빌드하면 URL이 지저분하고 사용자 친화적이지 않으며 검색 엔진에 친화적이지 않습니다.

 

예시

example.com/admin/user.php?q=1

request가 너무 복잡하고 길면 사용자는 이 URL에서 무엇을 표시하고 싶은지 알 수 없습니다.

URL을 만들 때는 사용자가 URL을 통해 페이지에 어떤 내용이 있는지 짐작할 수 있도록 하는 것이 바람직합니다.

 

라우터 변경하기

여기에 블로그 생성, 업데이트, 삭제, 조회를 할 수 있는 경로가 있다고 가정하겠습니다.

/blog : 모든 블로그 목록 표시
/blog/create : 블로그 생성을 위한 생성 페이지
/blog/update/id : 특정 ID로 업데이트 페이지
/blog/delete/id : 특정 ID로 삭제 페이지

/blog = index method
/blog/create = create method
/blog/update = update method
/blog/delete = delete method

 

application/config/route.php 파일을 열어 위의 블로그 내용을 아래와 같이 변경해보겠습니다.

$route['default_controller'] = 'welcome';
// Blog Controller 호출
$route['blog'] = 'blog';
// Blog Controller의 create Method를 호출합니다.
$route['blog/create'] = 'blog/create'; 
// Blog Controller의 create Method를 id 값을 인자로해서 호출합니다.
$route['blog/update/:id'] = 'blog/update';
// Blog Controller의 delete Method를 id 값을 인자로해서 호출합니다.
$route['blog/delete/:id'] = 'blog/delete';

 

CRUD Blog Application

Controller

application/controllers/Blog.php 파일을 만들고 아래 코드를 입력합니다.

(따로 Model을 만들지 않고 Controller에서 처리했습니다.)

<?php 
class Blog extends CI_Controller
{
    public function __construct()
    {
        // CodeIgniter 기본 생성자 호출
        parent::__construct();
        $this->load->database();
        $this->load->helper('url');
        $this->load->model('Blog_Model');
    }

    public function createTable()
    {
        $result = $this->Blog_Model->createTable();
        echo $result ? "테이블이 생성되었습니다." : "테이블 생성에 실패했습니다.";
    }

    public function deleteTable(){
        $result = $this->Blog_Model->deleteTable();
        echo $result ? "테이블이 삭제되었습니다." : "테이블 삭제에 실패했습니다.";
    }

    public function index()
    {
        $query = $this->db->query('select * from blog');
        $this->load->view('blog', array("data"=>$query->result()));
        
    }

    public function create()
    {
        $this->form_validation->set_rules('title', 'Title', 'required');
        $this->form_validation->set_rules('contents', 'Contents', 'required');

        if($this->form_validation->run() == FALSE)
        {
            $this->load->view('blog_create');
        }
        else
        {
            $title = $this->input->post('title');
            $contents = $this->input->post('contents');

            $query = "INSERT INTO blog(title, contents) VALUES(".$this->db->escape($title).",".$this->db->escape($contents).")";
            $result = $this->db->query($query);
            if($result)
            {
                redirect('Blog');
            }
            else
            {
                echo "등록에 실패했습니다. " . anchor('Blog','리스트 페이지로 이동하기');
            }
        }
    }

    public function update($id)
    {
        $this->form_validation->set_rules('title','Title','required');
        $this->form_validation->set_rules('contents','Contents','required');

        if($this->form_validation->run() == FALSE)
        {
            $query = $this->db->query('select * from blog where id ='.$id);
            $result['data'] = $query->row_array();
            $this->load->view('blog_update', $result);
        }
        else
        {
            $title = $this->input->post('title');
            $contents = $this->input->post('contents');
            $query = "UPDATE blog SET title = ".$this->db->escape($title).",contents = ".$this->db->escape($contents)." WHERE id = {$id}";
            $result = $this->db->query($query);
            if($result)
            {
                redirect('Blog');
            }
            else
            {
                echo "수정에 실패했습니다. " . anchor('Blog', '리스트 페이지로 이동하기');
            }
        }
    }

    public function delete($id)
    {
        $result = $this->db->query('delete from blog where id ='.$id);
        if($result)
        {
            redirect('Blog');
        }
        else
        {
            echo "삭제에 실패했습니다. " . anchor('Blog', '리스트 페이지로 이동하기');
        }
    }
}
?>

 

View

application/views/blog.php 파일을 만들고 아래 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Blog</title>
</head>
<body>
    <table width="600" border="1" cellspacing="5" cellpadding="5">
        <tr style="background:#CCC">
            <th>No</th>
            <th>title</th>
            <th>contents</th>
            <th>update</th>
            <th>delete</th>
        </tr>
        <?php 
        $i = 1;
        foreach($data as $row)
        {
            echo "<tr>";
                echo "<td>".$i."</td>";
                echo "<td>".$row->title."</td>";
                echo "<td>".$row->contents."</td>";
                echo "<td>". anchor('blog/update/'.$row->id, 'Update')."</td>";
                echo "<td>". anchor('blog/delete/'.$row->id, 'Delete') ."</td>";
            echo "<tr>";
            $i++;
        }
        ?>
    </table>
    <br />
    <?php echo anchor('blog/create', "Create"); ?>
</body>
</html>

 

application/views/blog_create.php 파일을 만들고 아래 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Blog</title>
</head>
<body>
    <?php echo form_open('blog/create')?>
        <h5>Title</h5>
        <input type="text" name="title" value="<?= set_value('title'); ?>" />
        <?php if(form_error('title'))
        {
            echo '<span style="color:red">'.form_error('title').'</span>';
        }
        ?>
        <h5>Contents</h5>
        <textarea name="contents" cols="30" rows="10" name="contents" value="<?= set_value('contents'); ?>"></textarea>
        <?php if(form_error('contents'))
        {
            echo '<span style="color:red">'.form_error('contents').'</span>';
        }
        ?>
        <br />
        <input type="submit" value="Create" />
        <?php echo anchor('Blog','Back'); ?>
    </form>
</body>
</html>

 

application/views/blog_update.php 파일을 만들고 아래 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Blog Update</title>
</head>
<body>
    <?php echo form_open('blog/update/'.$data['id'])?>
        <h5>Title</h5>
        <input type="text" name="title" value="<?= $data['title'] ?>" />
        <?php if(form_error('title'))
        {
            echo '<span style="color:red">'.form_error('title').'</span>';
        }
        ?>
        <h5>Contents</h5>
        <textarea name="contents" cols="30" rows="10" name="contents" value="<?php echo set_value('contents'); ?>"><?= $data['contents'] ?></textarea>
        <?php if(form_error('contents'))
        {
            echo '<span style="color:red">'.form_error('contents').'</span>';
        }
        ?>
        <br />
        <input type="submit" value="Update" />
        <?php echo anchor('Blog','Back'); ?>
    </form>
</body>
</html>

 

GitHub : https://github.com/jun0925/study/commit/4c18f0221c99c5c01e01cb2d66390aa0487f5773

728x90