📘 Day 5 (2025.09.23.TUE) - 뉴스 아이템 만들기

🛡️ CSRF 필터 활성화

app/Config/Filters.php - 잘못된 경로 침입 필터링

  <?php

  namespace Config;

  use CodeIgniter\Config\BaseConfig;

  class Filters extends BaseConfig
  {
    public $methods = [
      'post' => ['csrf'],
    ];
  }
📝 Create a form

app/Views/news/create.php 생성

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

<?= session()->getFlashdata('error') ?>
<?= service('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" cols="45" rows="4"></textarea><br />

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

app/Views/news/success.php 생성

News item created successfully.
📰 News 컨트롤러
  public function create()
  {
    $model = model(NewsModel::class);

    if ($this->request->getMethod() === 'POST' && $this->validate([
      'title' => 'required|min_length[3]|max_length[255]',
      'body' => 'required',
    ])) {
      $model->save([
        'title' => $this->request->getPost('title'),
        'slug' => url_title($this->request->getPost('title'), '-', true),
        'body' => $this->request->getPost('body'),
      ]);

      return view('news/success');
    }

    return view('templates/header', ['title' => 'Create a news item'])
      . view('news/create')
      . view('templates/footer');
  }
🛠️ 모델 업데이트

app/Models/NewsModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

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

  protected $allowedFields = ['title', 'slug', 'body'];
}
🌐 라우팅

app/Config/Routes.php

$routes->match(['get', 'post'], 'news/create', 'News::create');
$routes->get('news/(:segment)', 'News::view/$1');
$routes->get('news', 'News::index');
$routes->get('pages', 'Pages::index');
$routes->get('(:segment)', 'Pages::view/$1');
📷 실행 화면
뉴스 작성 화면 뉴스 작성 후 결과 성공 메시지