📘 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 실행