🔥

CodeIgniter4 個人的な初期設定

2023/12/07に公開

システム要件によって異なる箇所はあるが、初期設定として毎回触る箇所の備忘として残す。

動作確認環境

  • CodeIgniter 4.4.8 , 4.5.1

インストール

$ composer create-project codeigniter4/appstarter ci4app

システムメッセージの翻訳のインストール

$ cd ci4app
$ composer require codeigniter4/translations:dev-develop

Composer で使用する PHP バージョンを指定

$ composer config platform.php 7.4.33

基本設定

App

Index File

app/Config/App.php
- public string $indexPage = 'index.php';
+ public string $indexPage = '';

Default Locale

app/Config/App.php
- public string $defaultLocale = 'en';
+ public string $defaultLocale = 'ja';

Supported Locales

app/Config/App.php
- public array $supportedLocales = ['en'];
+ public array $supportedLocales = ['ja', 'en'];

Application Timezone

app/Config/App.php
- public string $appTimezone = 'UTC';
+ public string $appTimezone = 'Asia/Tokyo';

Cookie Secure

app/Config/Cookie.php
- public bool $secure = false;
+ public bool $secure = true;

Security

CSRF Protection Method

app/Config/Security.php
- public string $csrfProtection = 'cookie';
+ public string $csrfProtection = 'session';

CSRF Token Randomization

app/Config/Security.php
- public bool $tokenRandomize = false;
+ public bool $tokenRandomize = true;

CSRF Token Name

app/Config/Security.php
- public string $tokenName = 'csrf_test_name';
+ public string $tokenName = 'csrf_token';

CSRF Cookie Name

app/Config/Security.php
- public string $cookieName = 'csrf_cookie_name';
+ public string $cookieName = 'csrf_cookie';

CSRF Expires

app/Config/Security.php
- public int $expires = 7200;
+ public int $expires = 3600;

CSRF Regenerate

app/Config/Security.php
- public bool $regenerate = true;
+ public bool $regenerate = false;

Session

Session Cookie Name

app/Config/Session.php
- public string $cookieName = 'ci_session';
+ public string $cookieName = 'ci4app_session';

Session Expiration

app/Config/Session.php
- public int $expiration = 7200;
+ public int $expiration = 3600;

環境の追加

環境の追加

app/Config/Boot/production.phpstaging.php にコピーし適宜、カスタマイズ。

app/Config/Boot/staging.php
<?php

/*
 |--------------------------------------------------------------------------
 | ERROR DISPLAY
 |--------------------------------------------------------------------------
 | Don't show ANY in production environments. Instead, let the system catch
 | it and display a generic error message.
 |
 | If you set 'display_errors' to '1', CI4's detailed error report will show.
 */
ini_set('display_errors', '1');
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);

/*
 |--------------------------------------------------------------------------
 | DEBUG MODE
 |--------------------------------------------------------------------------
 | Debug mode is an experimental flag that can allow changes throughout
 | the system. It's not widely used currently, and may not survive
 | release of the framework.
 */
defined('CI_DEBUG') || define('CI_DEBUG', true);

コントローラー

ヘルパー

app/Controllers/BaseController.php
- protected $helpers = [];
+ protected $helpers = ['form', 'session'];

セッションライブラリのプリロード

app/Controllers/BaseController.php
- // protected $session;
+ protected $session;

  /**
   * @return void
   */
  public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
  {
      // Do Not Edit This Line
      parent::initController($request, $response, $logger);

      // Preload any models, libraries, etc, here.

-     // E.g.: $this->session = \Config\Services::session();
+     $this->session = \Config\Services::session();
  }

モデル

CodeIgniter\Model は複数主キーに対応しておらず、プロジェクト内でモデル毎に使用・未使用が異なるのはメンバーに混乱を招く(招いた)ので使用しない。

データベース接続のみのベースモデルを作成する。

app/Models/BaseModel.php
<?php

namespace App\Models;

use CodeIgniter\Database\BaseConnection;

class BaseModel
{
    protected BaseConnection $db;

    public function __construct()
    {
        $this->db = db_connect();
    }
}

各テーブルのモデルでベースモデルを継承して使用する。

app/Models/SampleModel.php
<?php

namespace App\Models;

use CodeIgniter\Database\BaseBuilder;

class SampleModel extends BaseModel
{
    private string $table = 'sample_table';

    private BaseBuilder $builder;

    public function __construct()
    {
        parent::__construct();
        $this->builder = $this->db->table($this->table);
    }
}

フィルター

CodeIgniter のバリデーションでは
引数を 1つだけとる PHP の組み込み関数をルールに指定することができる。

例えば、ルールに trim を指定するとバリデーションのタイミングで、送信された値の先頭および末尾にあるホワイトスペースを取り除くことが可能である。

値の整形の効果は
CodeIgniter 3 では、バリデーション以降も継続
CodeIgniter 4 では、バリデーション時のみ適用(バリデーション後には整形前の値に戻る)
という差異がある。

送信された値は一律 trim を行った上で扱いたい為、専用のフィルターを作成する。
Trim function before validating form input in Codeigniter 4 を参考に配列形式での POST にも対応させたものが以下である。

app/Config/Filters.php
  public array $globals = [
      'before' => [
          // 'honeypot',
-         // 'csrf',
+         'csrf',
          // 'invalidchars',
      ],
app/Filters/TrimFilter.php
<?php

namespace App\Filters;

use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;

class TrimFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        $trimmed_post = [];
        foreach ($request->getPost() as $key => $val) {
            if (is_string($val)) {
                $trimmed_post[$key] = trim($val);
            } else {
                array_walk_recursive($val, function (&$v) {
                    $v = trim($v);
                });
                $trimmed_post[$key] = $val;
            }
        }
        $request->setGlobal('post', $trimmed_post);
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        //
    }
}
app/Config/Filters.php
  namespace Config;

+ use App\Filters\TrimFilter;
  use CodeIgniter\Config\BaseConfig;
  use CodeIgniter\Filters\CSRF;
  use CodeIgniter\Filters\DebugToolbar;
  use CodeIgniter\Filters\Honeypot;
  use CodeIgniter\Filters\InvalidChars;
  use CodeIgniter\Filters\SecureHeaders;
app/Config/Filters.php
  public array $aliases = [
      'csrf'          => CSRF::class,
      'toolbar'       => DebugToolbar::class,
      'honeypot'      => Honeypot::class,
      'invalidchars'  => InvalidChars::class,
      'secureheaders' => SecureHeaders::class,
+     'trim'          => TrimFilter::class,
  ];
app/Config/Filters.php
- public array $methods = [];
+ public array $methods = [
+     'post' => ['trim'],
+ ];

バリデーションメッセージ

app/Language/en/Validation.phpja/Validation.php にコピーし適宜、カスタマイズ。

app/Language/ja/Validation.php
<?php

// override core en language system validation or define your own en language validation message
return [
    'required' => '{field} を入力してください。',
];

独自定数定義

app/Config/CustomConstants.php
<?php
const FOO = 'foo';
const BAR = 'bar';
const BAZ = 'baz';
app/Config/App.php
  class App extends BaseConfig
  {
      // ...
      public bool $CSPEnabled = false;
+
+     public function __construct()
+     {
+         parent::__construct();
+         require_once(APPPATH . 'Config' . DIRECTORY_SEPARATOR . 'CustomConstants.php');
+     }
  }

Discussion