CI4

[코드이그나이터] [첫번째 어플리케이션 제작(튜터리얼)] 뉴스 아이템 만들기 [데이터 등록 페이지]

으누아빠 2020. 8. 31. 23:33
반응형

뉴스 아이템 만들기 [데이터 등록]

출처:
http://ci4doc.cikorea.net/tutorial/create_news_items.html

뉴스 아이템 만들기는 폼페이지를 제작하고 입력값을 테이블에 저장 하는 페이지를 생성함

form 생성

app/Views/news/create.php

<h2><?= esc($title); ?></h2>

<?= \Config\Services::validation()->listErrors(); ?>

<form action="/news/create" method="post">
    <?= csrf_field() ?>

    <label for="title">Title</label>
    <input type="input" name="title" /><br />

    <label for="body">Text</label>
    <textarea name="body"></textarea><br />

    <input type="submit" name="submit" value="Create news item" />

</form>

\Config\Services::validation()->listErrors()는 오류검증시 관련된 오류를 보고 하는데 사용함

csrf_field() CSRF 토큰을 이용하여 일반적인 공격으로 부터 보호하는 기능을 함

controller 설정

app/Controllers/News.php


    public function create()
    {
        $model = new NewsModel();

        //유효성 검증

        // getMethod([$upper = FALSE])
        // Parameters:    
        //     $upper (bool) – 요청 메소드 이름을 대문자 또는 소문자로 반환할지 여부
        // Returns:    HTTP 요청 방법(request method) 예 get,post
        // Return type:    string

        // validate($rules, array $messages = [])
        // 입력 데이터의 유효성을 검증함 만약 유효성 검증을 실패할경우 error 속성이 부여됨
        // Parameters:    
        //     $rules (array|string) 유효성 규칙
        //     $messages (array) 사용자 지정 에러메세지의 배열
        // Return type: boolean

        if ($this->request->getMethod() === 'post' && $this->validate([
            'title' => 'required|min_length[3]|max_length[255]',
            'body'  => 'required'
        ])) {

            // 데이터 등록
            // url_title($str[, $separator = '-'[, $lowercase = FALSE]]) URL HELPER
            // 문자열을 입력으로 받아서 사람에게 친숙한 URL 문자열 생성
            // Parameters:    
            //     $str (string) – 입력 문자열
            //     $separator (string) – 단어 구분 기호
            //     $lowercase (bool) – 출력 문자열을 소문자로 변환할지 여부
            // Returns: URL-formatted 문자열
            // Return type: string

            // 예:
            // $title     = "What's wrong with CSS?";
            // $url_title = url_title($title);
            // Produces: Whats-wrong-with-CSS
            $model->save([
                'title' => $this->request->getPost('title'),
                'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
                'body'  => $this->request->getPost('body'),
            ]);

            echo view('news/success');
        } else {

            //유효성 검증시 오류가 발생할경우 등록폼 노출
            echo view('templates/header', ['title' => 'Create a news item']);
            echo view('news/create');
            echo view('templates/footer');
        }
    }

CI3 에서는 GET,POST 값을 가져올 경우 $this->input->post('필드명'), $this->input->get('필드명')을 이용하였으나 CI4 에서는 $this->request->getPost('필드명'), $this->request->getGet('필드명')을 이용

성공 페이지 생성

app/Views/news/success.php 생성

News item created successfully.

model 업데이트

app/Models/NewsModel.php


<?php

namespace App\Models;

use CodeIgniter\Model;

class NewsModel extends Model
{
    protected $table = 'news';

    //업데이트 가능한 필드 목록을 지정

    protected $allowedFields = ['title', 'slug', 'body'];

    public function getNews($slug = false)
    {
        if ($slug === false) {
            return $this->findAll();
        }

        return $this->asArray()
            ->where(['slug' => $slug])
            ->first();
    }
}

라우팅

app/Config/Routes.php 파일을 수정하여 라우팅설정을 한다.

/**
 * --------------------------------------------------------------------
 * Route Definitions
 * --------------------------------------------------------------------
 */

// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index');

// $routes->match(array $verbs = [], string $from, $to, array $options = null): RouteCollectionInterface

// Example:
// $route->match( ['get', 'post'], 'users/(:num)', 'users/$1);
// Parameters:        
//     $verbs    array 
//     $from     string       
//     $to       string|array 
//     $options  array|null   

// $verbs 배열항목 중 HTTP Verbs 가 일치한 경우 해당 라우팅 규칙에 따라 처리가 되도록 하는 메서드 

// HTTP Method(HTTP Verbs) 데이터를 보내는 방식을 표시해주는 역할을 함
// 종류: GET, POST, PUT, PATCH, DELETE

$routes->match(['get', 'post'], 'news/create', 'News::create');
$routes->get('news/(:segment)', 'News::view/$1');
$routes->get('news', 'News::index');
$routes->get('(:any)', 'Pages::view/$1');