📘 Day 4 (2025.09.18.THU) - 뉴스 섹션 설정

💻 xampp MySQL 작업(localhost 웹사이트)

작업할 데이터베이스 생성

데이터베이스 생성: ci4tutorial

📋 테이블 생성(콘솔 복붙)
  CREATE TABLE news (
    id int(11) NOT NULL AUTO_INCREMENT,
    title varchar(128) NOT NULL,
    slug varchar(128) NOT NULL,
    body text NOT NULL,
    PRIMARY KEY (id),
    KEY slug (slug)
  );

💾 news 시드 레코드(콘솔 복붙)
  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.');
🔌 데이터베이스에 연결

app/Config/Database.php

  'username' => 'root',
  'database' => 'ci4tutorial'
🛠️ 모델(model) 설정

app/Models/ 디렉터리에 NewsModel.php 추가

  <?php
  namespace App\Models;
  use CodeIgniter\Model;

  class NewsModel extends Model
  {
    protected $table = 'news';
  }
✏️ 내용 추가
  <?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();
    }
  }
ℹ️ 코드 설명
  • 모든 뉴스 레코드 조회 → findAll() 사용
  • 특정 slug로 뉴스 항목 조회 → first() 사용
  • $slug 변수: 쿼리 실행 전에 값이 제거되지 않아, 유효한 경우에만 특정 뉴스 항목 조회에 사용됨
  • CodeIgniter의 Model 클래스 메소드:
    • findAll() : 설정된 $table에서 모든 레코드 가져오기 → 객체 배열 반환
    • first() : 조건에 맞는 첫 번째 레코드 가져오기
📰 뉴스 표시

app/Controllers/News.php 생성

  <?php

  namespace App\Controllers;

  use App\Models\NewsModel;

  class News extends BaseController
  {
    public function index() {
      $model = model(NewsModel::class); //NewsModel 불러오기

      $data['news'] = $model->getNews();
    }

    public function view($slug = null) {
      $model = model(NewsModel::class);
      $data['news'] = $model->getNews($slug); //slug가 있다면 데이터에 넣어주기
    }
  }
index() 내용 추가
  <?php

  namespace App\Controllers;

  use App\Models\NewsModel;

  class News extends BaseController
  {
    public function index() {
      $model = model(NewsModel::class);

      $data = [
        'news' => $model->getNews(),
        'title' => 'News archive',
      ];

      return view('templates/header', $data)
        . view('news/overview')
        . view('templates/footer');
    }

    public function view($slug = null) {
      $model = model(NewsModel::class);
      $data['news'] = $model->getNews($slug);
    }
  }
app/Views/news/overview.php 생성
  <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 ?>
view() 내용 추가
  <?php

  namespace App\Controllers;

  use App\Models\NewsModel;

  class News extends BaseController
  {
    public function index() {
      $model = model(NewsModel::class);

      $data = [
        'news' => $model->getNews(),
        'title' => 'News archive',
      ];

      return view('templates/header', $data)
        . view('news/overview')
        . view('templates/footer');
    }

    public function view($slug = null) {
      $model = model(NewsModel::class);
      $data['news'] = $model->getNews($slug);

      if (empty($data['news'])) {
        throw new \CodeIgniter\Exceptions\PageNotFoundException('Cannot find the news item: ' . $slug);
      }

      $data['title'] = $data['news']['title'];

      return view('templates/header', $data)
        . view('news/view')
        . view('templates/footer');
    }
  }
app/Views/news/view.php 생성
<h2><?= esc($news['title']) ?></h2> <p><?= esc($news['body']) ?></p>
라우팅
  $routes->get('news/(:segment)', 'News::view/$1');
  $routes->get('news', 'News::index');
  $routes->get('pages', 'Pages::index');
  $routes->get('(:segment)', 'Pages::view/$1');
웹 실행

localhost/news 실행

News 실행 화면