CodeIgniter4 입문 공식 강좌 (2) DB 데이터 표시

CodeIgniter Advent Calendar 2021
CodeIgniter 4 시작 공식 자습서 (1) 정적 페이지 표시
계속
  • News section — CodeIgniter 4.1.5 documentation
  • 이번부터 데이터베이스를 사용합니다.
    카탈로그
  • CodeIgniter 4 시작 공식 자습서 (1) 정적 페이지 표시
  • CodeIgniter4 입문 공식 강좌 (2) DB 데이터 표시
  • CodeIgniter4 입문 공식 강좌 (3) DB에 데이터 추가
  • MySQL에서 데이터베이스 준비


    강좌에 사용할 데이터베이스를 만듭니다.
    http://localhost:81/의 phpMyAdmin에 액세스합니다.

    데이터베이스 만들기


    데이터베이스ci4tutorial를 만듭니다.

    명령이 생성되면 다음을 수행합니다.
    CREATE DATABASE `ci4tutorial` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
    
    사용자dbuser에게 권한을 수여ci4tutorial.다음 SQL 문을 실행합니다.
    GRANT ALL PRIVILEGES ON `ci4tutorial`.* TO `dbuser`@`%`;
    

    테이블 작성

    news 양식을 만듭니다.다음 SQL 문을 실행합니다.
    CREATE TABLE news (
        id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        title VARCHAR(128) NOT NULL,
        slug VARCHAR(128) NOT NULL,
        body TEXT NOT NULL,
        PRIMARY KEY (id),
        KEY slug (slug)
    );
    

    데이터 삽입


    초기 데이터를 삽입합니다.다음 SQL 문을 실행합니다.
    INSERT INTO news VALUES
    (1,'Elvis sighted','elvis-sighted','Elvis was sighted at the Podunk internet cafe. It looked like he was writing a CodeIgniter app.'),
    (2,'Say it isn\'t so!','say-it-isnt-so','Scientists conclude that some programmers have a sense of humor.'),
    (3,'Caffeination, Yes!','caffeination-yes','World\'s largest coffee shop open onsite nested coffee shop for staff only.');
    

    삽입된 데이터를 확인합니다.

    CodeIgniter4에 대한 데이터베이스 설정

    .env 다음과 같은 설정 파일의 데이터베이스 연결 정보.DB_DATABASEci4tutorial로 변경되었습니다.
    DB_DATABASE = ci4tutorial
    DB_USERNAME = dbuser
    DB_PASSWORD = dbpassword
    
    database.default.hostname = database
    database.default.database = "${DB_DATABASE}"
    database.default.username = "${DB_USERNAME}"
    database.default.password = "${DB_PASSWORD}"
    database.default.DBDriver = MySQLi
    database.default.DBPrefix =
    

    NewsModel 생성

    news 액세스 테이블NewsModel을 만듭니다.app/Models/NewsModel.php
    <?php
    namespace App\Models;
    
    use CodeIgniter\Model;
    
    class NewsModel extends Model
    {
        protected $table = 'news';
    
        public function getNews($slug = false)
        {
            if ($slug === false) {
                return $this->findAll();
            }
        
            return $this->where(['slug' => $slug])->first();
        }
    }
    
    CodeIgniter\ModelfindAll()방법과 first()방법을 사용하여 news표에서 데이터를 얻습니다.

    뉴스 컨트롤러 만들기

    News 디렉터 생성app/Controllers/News.php
    <?php
    namespace App\Controllers;
    
    use App\Models\NewsModel;
    use CodeIgniter\Controller;
    use CodeIgniter\Exceptions\PageNotFoundException;
    
    class News extends Controller
    {
        public function index()
        {
            $model = model(NewsModel::class);
    
            $data = [
                'news'  => $model->getNews(),
                'title' => 'News archive',
            ];
            dd($data);
        
            echo view('templates/header', $data);
            echo view('news/overview', $data);
            echo view('templates/footer', $data);
        }
    
        public function view($slug = null)
        {
            $model = model(NewsModel::class);
        
            $data['news'] = $model->getNews($slug);
        
            if (empty($data['news'])) {
                throw new PageNotFoundException('Cannot find the news item: ' . $slug);
            }
        
            $data['title'] = $data['news']['title'];
            dd($data);
        
            echo view('templates/header', $data);
            echo view('news/view', $data);
            echo view('templates/footer', $data);
        }
    }
    
    CodeIgniter4의 함수 실례화 모델 클래스.
    CodeIgniter4의 model() 함수는 dd() 의 값을 보여 줍니다.

    라우팅 설정


    지난번에는 루트 설정으로 인해 모든 루트가 $data 컨트롤러에 의해 처리되었기 때문에 현재 컨트롤러에 접근할 수 없습니다Pages.
    따라서 News 액세스 컨트롤러 경로를 추가합니다.News
    --- a/app/Config/Routes.php
    +++ b/app/Config/Routes.php
    @@ -33,6 +33,8 @@ $routes->setAutoRoute(true);
     // route since we don't have to scan directories.
     $routes->get('/', 'Home::index');
     
    +$routes->get('news/(:segment)', 'News::view/$1');
    +$routes->get('news', 'News::index');
     $routes->get('(:any)', 'Pages::view/$1');
     
     /*
    
    http://localhost/news에 접근할 때CodeIgniter4의 app/Config/Routes.php 방법은 dd()의 값을 표시합니다.

    데이터베이스에 등록된 레코드의 값을 볼 수 있습니다.
    방문도 해보세요http://localhost/news/elvis-sighted.

    데이터베이스와의 교환을 확인한 후 디버깅용$data 함수를 삭제합니다.
    --- a/app/Controllers/News.php
    +++ b/app/Controllers/News.php
    @@ -15,7 +15,6 @@ class News extends Controller
                 'news'  => $model->getNews(),
                 'title' => 'News archive',
             ];
    -        dd($data);
     
             echo view('templates/header', $data);
             echo view('news/overview', $data);
    @@ -33,7 +32,6 @@ class News extends Controller
             }
     
             $data['title'] = $data['news']['title'];
    -        dd($data);
     
             echo view('templates/header', $data);
             echo view('news/view', $data);
    

    View 파일 생성


    목록 페이지의 dd()를 추가합니다.
    <h2><?= esc($title) ?></h2>
    
    <?php if (! empty($news) && is_array($news)): ?>
    
        <?php foreach ($news as $news_item): ?>
    
            <h3><?= esc($news_item['title']) ?></h3>
    
            <div class="main">
                <?= esc($news_item['body']) ?>
            </div>
            <p><a href="/news/<?= esc($news_item['slug'], 'url') ?>">View article</a></p>
    
        <?php endforeach ?>
    
    <?php else: ?>
    
        <h3>No News</h3>
    
        <p>Unable to find any news for you.</p>
    
    <?php endif ?>
    
    CodeIgniter4의 app/Views/news/overview.php 함수는 HTML에서 도피 처리를 하는 함수입니다.
    XSS의 취약성이 만들어지지 않도록 원칙적으로 보기에 있는 모든 변수는 이 함수로 처리된다.
    또한 탭esc() 속성의 값을 출력할 때 두 번째 파라미터에 상하문<a>을 지정합니다href와 같이 사용합니다.
    다음은 개별 문장 페이지의 url를 추가합니다.
    <h2><?= esc($news['title']); ?></h2>
    <p><?= esc($news['body']); ?></p>
    
    이렇게 되면 시야 파일이 모두 준비된다.

    확인 표시


    방문해 보세요http://localhost/news.

    포스트 목록이 표시됩니다.
    View article 액세스http://localhost/news/elvis-sighted를 클릭합니다.

    개별 문장도 보였다.
    CodeIgniter4 입문 공식 강좌 (3) DB에 데이터 추가
    계속해.

    참고 자료

  • News section — CodeIgniter 4.1.5 documentation
  • Using CodeIgniter’s Model — CodeIgniter 4.1.5 documentation
  • 좋은 웹페이지 즐겨찾기