CodeIgniter4 個人的な初期設定
システム要件によって異なる箇所はあるが、初期設定として毎回触る箇所の備忘として残す。
動作確認環境
- 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
- public string $indexPage = 'index.php';
+ public string $indexPage = '';
Default Locale
- public string $defaultLocale = 'en';
+ public string $defaultLocale = 'ja';
Supported Locales
- public array $supportedLocales = ['en'];
+ public array $supportedLocales = ['ja', 'en'];
Application Timezone
- public string $appTimezone = 'UTC';
+ public string $appTimezone = 'Asia/Tokyo';
Cookie
Cookie Secure
- public bool $secure = false;
+ public bool $secure = true;
Security
CSRF Protection Method
- public string $csrfProtection = 'cookie';
+ public string $csrfProtection = 'session';
CSRF Token Randomization
- public bool $tokenRandomize = false;
+ public bool $tokenRandomize = true;
CSRF Token Name
- public string $tokenName = 'csrf_test_name';
+ public string $tokenName = 'csrf_token';
CSRF Cookie Name
- public string $cookieName = 'csrf_cookie_name';
+ public string $cookieName = 'csrf_cookie';
CSRF Expires
- public int $expires = 7200;
+ public int $expires = 3600;
CSRF Regenerate
- public bool $regenerate = true;
+ public bool $regenerate = false;
Session
Session Cookie Name
- public string $cookieName = 'ci_session';
+ public string $cookieName = 'ci4app_session';
Session Expiration
- public int $expiration = 7200;
+ public int $expiration = 3600;
環境の追加
app/Config/Boot/production.php
を 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);
コントローラー
ヘルパー
- protected $helpers = [];
+ protected $helpers = ['form', 'session'];
セッションライブラリのプリロード
- // 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
は複数主キーに対応しておらず、プロジェクト内でモデル毎に使用・未使用が異なるのはメンバーに混乱を招く(招いた)ので使用しない。
データベース接続のみのベースモデルを作成する。
<?php
namespace App\Models;
use CodeIgniter\Database\BaseConnection;
class BaseModel
{
protected BaseConnection $db;
public function __construct()
{
$this->db = db_connect();
}
}
各テーブルのモデルでベースモデルを継承して使用する。
<?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 にも対応させたものが以下である。
public array $globals = [
'before' => [
// 'honeypot',
- // 'csrf',
+ 'csrf',
// 'invalidchars',
],
<?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)
{
//
}
}
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;
public array $aliases = [
'csrf' => CSRF::class,
'toolbar' => DebugToolbar::class,
'honeypot' => Honeypot::class,
'invalidchars' => InvalidChars::class,
'secureheaders' => SecureHeaders::class,
+ 'trim' => TrimFilter::class,
];
- public array $methods = [];
+ public array $methods = [
+ 'post' => ['trim'],
+ ];
バリデーションメッセージ
app/Language/en/Validation.php
を ja/Validation.php
にコピーし適宜、カスタマイズ。
<?php
// override core en language system validation or define your own en language validation message
return [
'required' => '{field} を入力してください。',
];
独自定数定義
<?php
const FOO = 'foo';
const BAR = 'bar';
const BAZ = 'baz';
class App extends BaseConfig
{
// ...
public bool $CSPEnabled = false;
+
+ public function __construct()
+ {
+ parent::__construct();
+ require_once(APPPATH . 'Config' . DIRECTORY_SEPARATOR . 'CustomConstants.php');
+ }
}
Discussion