CodeIgniter3とは?フレームワークの特徴と選ぶべき理由
軽量で高速な処理が可能なPHPフレームワーク
CodeIgniter3は、高速な処理速度と軽量な設計を特徴とする、信頼性の高いPHPフレームワークです。基本システムのメモリ使用量はわずか2MB程度と非常に軽量で、最小限の設定で動作を開始できる特徴があります。
主な特徴:
- 最小限の設定で即座に開発開始が可能
- システムコアが軽量(約2MB)で高速な処理を実現
- 必要な機能のみを選択的に利用可能な柔軟な設計
- フレームワークの中核機能に集中した無駄のない構成
特に処理速度については、他の主要なPHPフレームワークと比較しても優位性があります:
| フレームワーク | 基本処理速度(ms) | メモリ使用量(MB) |
|---|---|---|
| CodeIgniter3 | 0.8-1.2 | 2-3 |
| Laravel | 2.5-3.0 | 8-10 |
| Symfony | 2.0-2.5 | 6-8 |
| Yii | 1.5-2.0 | 4-6 |
学習コストが低く、短期間で習得可能な設計思想
CodeIgniter3の大きな特徴の一つが、直感的で理解しやすい設計思想です。PHPの基本的な知識があれば、短期間で実践的な開発を始めることができます。
学習しやすい理由:
- 明確なディレクトリ構造
- application/: アプリケーションのコード
- system/: フレームワークのコア
- public/: 公開ディレクトリ
- シンプルなルーティング設計
// URLパターン: example.com/controller/method/param class Blog extends CI_Controller { public function view($id) { // example.com/blog/view/1 でアクセス $this->load->model('blog_model'); $data['post'] = $this->blog_model->get_post($id); $this->load->view('blog_view', $data); } } - 豊富なドキュメントとコミュニティサポート
- 公式ドキュメントが充実
- Stack Overflowなどでの情報が豊富
- 日本語の技術情報も多数存在
大手企業での採用実績と安定した実績
CodeIgniter3は、多くの大手企業や重要なプロジェクトで採用されており、その実績は安定性と信頼性を証明しています。
主な採用企業とプロジェクト:
- ExpressionEngine(CMS): CodeIgniterをベースに開発
- MaxCMS: エンタープライズ向けCMS
- 国内の大手EC企業の基幹システム
- 政府機関のWebサービス
- 教育機関の学習管理システム
長期運用のメリット:
- セキュリティアップデートの継続的な提供
- 広範なコミュニティによるサポート
- 豊富な実績に基づく信頼性
- 多数の実装例とベストプラクティスの存在
CodeIgniter3は、特に以下のようなプロジェクトに最適です:
- 高速なレスポンスが求められるWebアプリケーション
- リソースの制限がある環境での開発
- 短期間での開発が必要なプロジェクト
- レガシーシステムのモダナイゼーション
このフレームワークは、その軽量性、高速性、学習のしやすさから、多くの開発者に選ばれ続けています。特に、パフォーマンスとシンプルさを重視するプロジェクトにおいて、CodeIgniter3は非常に有効な選択肢となります。
CodeIgniter3の環境構築から始める実践的な開発ガイド
最新バージョンのインストールとサーバー要件
CodeIgniter3を効率的に運用するために、まずは適切な環境構築が重要です。以下に、詳細な手順と要件を説明します。
サーバー要件:
- PHP バージョン 5.6以上(推奨:PHP 7.3以上)
- MySQL (5.1+)、PostgreSQL、SQLite、またはMSSQL
- Apache/Nginxウェブサーバー
- mod_rewriteモジュール(きれいなURLに必要)
インストール手順:
- Composerを使用したインストール
# Composerを使用してプロジェクトを作成 composer create-project codeigniter/framework project-name # 必要な依存関係をインストール cd project-name composer install
- 手動インストール
# GitHubからソースコードをダウンロード git clone https://github.com/bcit-ci/CodeIgniter.git # または公式サイトからZIPをダウンロード # ファイルを適切なディレクトリに配置 mv CodeIgniter/* /var/www/html/
データベース設定とマイグレーションの実装方法
データベース接続の設定はapplication/config/database.phpで行います:
// データベース設定例
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'your_username',
'password' => 'your_password',
'database' => 'your_database',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
マイグレーションの実装:
- マイグレーション設定の有効化
// application/config/migration.php $config['migration_enabled'] = TRUE; $config['migration_type'] = 'timestamp';
- マイグレーションファイルの作成
// application/migrations/20240305000000_create_users_table.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Migration_Create_users_table extends CI_Migration {
public function up() {
$this->dbforge->add_field(array(
'id' => array(
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
'auto_increment' => TRUE
),
'username' => array(
'type' => 'VARCHAR',
'constraint' => 100,
),
'email' => array(
'type' => 'VARCHAR',
'constraint' => 100,
),
'created_at' => array(
'type' => 'DATETIME',
'null' => TRUE,
),
));
$this->dbforge->add_key('id', TRUE);
$this->dbforge->create_table('users');
}
public function down() {
$this->dbforge->drop_table('users');
}
}
- マイグレーションの実行
// マイグレーションコントローラー
public function migrate() {
$this->load->library('migration');
if ($this->migration->current() === FALSE) {
show_error($this->migration->error_string());
}
}
効率的な開発のためのIDE設定とデバッグツール
効率的な開発環境の構築には、適切なIDE設定とデバッグツールの導入が不可欠です。
推奨IDE設定(PHPStorm/VSCode):
- PHPStorm設定
- CodeIgniter3プラグインのインストール
- PHPUnit統合の設定
- コードスニファー(PHP_CodeSniffer)の設定
- Xdebugの設定
// PHPStorm用.idea/php.xml設定例
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PhpIncludePathManager">
<include_path>
<path value="$PROJECT_DIR$/vendor" />
<path value="$PROJECT_DIR$/system" />
</include_path>
</component>
</project>
- VSCode設定
// settings.json
{
"php.suggest.basic": true,
"php.validate.enable": true,
"php.validate.run": "onType",
"php.executablePath": "/usr/bin/php",
"php.debug.ideKey": "VSCODE"
}
デバッグツールとモニタリング:
- Xdebugの設定
; php.ini Xdebug設定 xdebug.mode=debug xdebug.start_with_request=yes xdebug.client_host=127.0.0.1 xdebug.client_port=9003
- プロファイリングツール
- PHP Debug Bar
- CodeIgniter Profiler
// プロファイラーの有効化 $this->output->enable_profiler(TRUE);
- ログ設定
// application/config/config.php $config['log_threshold'] = 4; // 開発環境では詳細なログを取得 $config['log_path'] = APPPATH . 'logs/';
この環境構築ガイドに従うことで、効率的なCodeIgniter3開発環境を整えることができます。特に、デバッグツールとIDEの適切な設定は、開発効率を大きく向上させる重要な要素となります。
MVCアーキテクチャで実現する保守性の高いコード設計
モデル・ビュー・コントローラーの役割と実装例
CodeIgniter3のMVCアーキテクチャは、アプリケーションを論理的に分離し、保守性の高いコード設計を実現します。各層の役割と実装例を詳しく見ていきましょう。
- コントローラー (Controller)
// application/controllers/Blog.php
class Blog extends CI_Controller {
public function __construct() {
parent::__construct();
// モデルのロード
$this->load->model('blog_model');
// ライブラリのロード
$this->load->library('form_validation');
}
public function index() {
// ビジネスロジックの実装
$data['posts'] = $this->blog_model->get_all_posts();
// ビューへのデータ受け渡し
$this->load->view('templates/header');
$this->load->view('blog/index', $data);
$this->load->view('templates/footer');
}
public function create() {
// フォームバリデーションルールの設定
$this->form_validation->set_rules('title', 'タイトル', 'required');
$this->form_validation->set_rules('content', '内容', 'required');
if ($this->form_validation->run() === FALSE) {
$this->load->view('templates/header');
$this->load->view('blog/create');
$this->load->view('templates/footer');
} else {
$this->blog_model->create_post();
redirect('blog');
}
}
}
- モデル (Model)
// application/models/Blog_model.php
class Blog_model extends CI_Model {
private $table = 'posts';
public function __construct() {
parent::__construct();
$this->load->database();
}
// リポジトリパターンを活用したデータアクセス
public function get_all_posts() {
$query = $this->db->get($this->table);
return $query->result_array();
}
public function get_post($id) {
$query = $this->db->get_where($this->table, array('id' => $id));
return $query->row_array();
}
public function create_post() {
$data = array(
'title' => $this->input->post('title'),
'content' => $this->input->post('content'),
'created_at' => date('Y-m-d H:i:s')
);
return $this->db->insert($this->table, $data);
}
}
- ビュー (View)
<!-- application/views/blog/index.php -->
<div class="container">
<h2>ブログ記事一覧</h2>
<?php foreach ($posts as $post): ?>
<article class="post">
<h3><?php echo htmlspecialchars($post['title']); ?></h3>
<div class="content">
<?php echo htmlspecialchars($post['content']); ?>
</div>
<div class="meta">
投稿日: <?php echo $post['created_at']; ?>
</div>
</article>
<?php endforeach; ?>
</div>
ルーティングとURLの設計ベストプラクティス
CodeIgniter3でのルーティング設計は、アプリケーションの使いやすさと保守性に大きく影響します。
- ルーティング設定
// application/config/routes.php $route['default_controller'] = 'pages/view'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; // RESTfulなルーティング設計 $route['blog'] = 'blog/index'; $route['blog/create'] = 'blog/create'; $route['blog/(:num)'] = 'blog/view/$1'; $route['blog/edit/(:num)'] = 'blog/edit/$1'; $route['blog/delete/(:num)'] = 'blog/delete/$1'; // カスタムルーティング $route['api/v1/posts'] = 'api/posts/index'; $route['api/v1/posts/(:num)'] = 'api/posts/show/$1';
- URLヘルパーの活用
// ビュー内でのURL生成
echo base_url('blog/create');
echo site_url('blog/view/' . $post_id);
// リダイレクト
redirect('blog/view/' . $post_id);
ビジネスロジックの適切な配置と責務の分離
ビジネスロジックを適切に分離し、SOLID原則に従ったコード設計を実現します。
- サービスレイヤーの導入
// application/libraries/Blog_service.php
class Blog_service {
private $CI;
public function __construct() {
$this->CI =& get_instance();
$this->CI->load->model('blog_model');
}
public function create_post($data) {
// バリデーションと業務ロジック
if ($this->validate_post($data)) {
return $this->CI->blog_model->create_post($data);
}
return false;
}
private function validate_post($data) {
// カスタムバリデーションロジック
return true;
}
}
- 共通処理の分離
// application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
protected $data = array();
public function __construct() {
parent::__construct();
// 共通の初期化処理
$this->load->helper('url');
$this->load->library('session');
$this->init();
}
protected function init() {
// ユーザー認証状態の確認など
$this->data['user'] = $this->session->userdata('user');
}
protected function render($view) {
$this->load->view('templates/header', $this->data);
$this->load->view($view, $this->data);
$this->load->view('templates/footer', $this->data);
}
}
- イベントハンドリング
// application/hooks/Blog_hooks.php
class Blog_hooks {
private $CI;
public function __construct() {
$this->CI =& get_instance();
}
public function post_created($post_id) {
// 投稿作成後の処理
log_message('info', 'New post created: ' . $post_id);
// キャッシュのクリアなど
$this->CI->cache->clean();
}
}
このようなMVCアーキテクチャの適切な実装により、以下のメリットが得られます:
- コードの再利用性の向上
- テストの容易性
- 保守性の向上
- チーム開発での作業効率の向上
- 拡張性の確保
特に、サービスレイヤーの導入とビジネスロジックの適切な分離は、アプリケーションの長期的な保守性と拡張性を大きく向上させます。
セキュリティ対策を万全にする実装テクニック
XSS対策とCSRF対策の実装方法
CodeIgniter3では、セキュリティ機能が標準で組み込まれていますが、適切な実装と設定が必要です。
- XSS(クロスサイトスクリプティング)対策
// application/config/config.php
$config['global_xss_filtering'] = TRUE; // グローバルXSSフィルタリングの有効化
// 入力データの安全な処理
class Posts extends CI_Controller {
public function create() {
// XSS Clean機能の使用
$title = $this->security->xss_clean($this->input->post('title'));
$content = $this->security->xss_clean($this->input->post('content'));
// HTMLPurifierの統合(より強力なXSS対策)
$this->load->library('html_purifier');
$clean_html = $this->html_purifier->purify($content);
// ビューでのエスケープ処理
$data['content'] = html_escape($clean_html);
}
}
- CSRF(クロスサイトリクエストフォージェリ)対策
// application/config/config.php
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_token_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
// フォームでのCSRFトークン実装
<form method="post" action="<?php echo base_url('posts/create'); ?>">
<?php echo form_hidden($this->security->get_csrf_token_name(), $this->security->get_csrf_hash()); ?>
<!-- フォーム要素 -->
</form>
// AjaxリクエストでのCSRF対策
<script>
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-TOKEN', $('meta[name="csrf-token"]').attr('content'));
}
});
</script>
セッション管理とユーザー認証の安全な実装
セキュアなユーザー認証システムの実装例を示します。
- セッション設定
// application/config/config.php
$config['sess_driver'] = 'database'; // データベースセッション
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = TRUE;
// セッションテーブルの作成
CREATE TABLE ci_sessions (
id varchar(128) NOT NULL,
ip_address varchar(45) NOT NULL,
timestamp int(10) unsigned DEFAULT 0 NOT NULL,
data blob NOT NULL,
PRIMARY KEY (id),
KEY ci_sessions_timestamp (timestamp)
);
- 安全なユーザー認証システム
// application/libraries/Auth.php
class Auth {
private $CI;
public function __construct() {
$this->CI =& get_instance();
$this->CI->load->model('user_model');
$this->CI->load->library('session');
}
public function login($email, $password) {
// パスワードハッシュの検証
$user = $this->CI->user_model->get_by_email($email);
if ($user && password_verify($password, $user['password_hash'])) {
// セッションデータの設定
$session_data = array(
'user_id' => $user['id'],
'email' => $user['email'],
'last_login' => date('Y-m-d H:i:s'),
'is_logged_in' => TRUE
);
$this->CI->session->set_userdata($session_data);
// ログイン履歴の記録
$this->log_login_attempt($user['id'], TRUE);
return TRUE;
}
$this->log_login_attempt(0, FALSE);
return FALSE;
}
private function log_login_attempt($user_id, $success) {
$data = array(
'user_id' => $user_id,
'ip_address' => $this->CI->input->ip_address(),
'success' => $success,
'timestamp' => date('Y-m-d H:i:s')
);
$this->CI->db->insert('login_attempts', $data);
}
}
- 認証ミドルウェアの実装
// application/core/MY_Controller.php
class Auth_Controller extends CI_Controller {
protected $user;
public function __construct() {
parent::__construct();
$this->load->library('auth');
$this->check_auth();
}
private function check_auth() {
if (!$this->session->userdata('is_logged_in')) {
redirect('auth/login');
}
// セッションハイジャック対策
if ($this->session->userdata('ip_address') !== $this->input->ip_address()) {
$this->session->sess_destroy();
redirect('auth/login');
}
}
}
SQLインジェクション対策とデータベースセキュリティ
データベース操作におけるセキュリティ対策を実装します。
- クエリビルダーの使用
// 安全なクエリの実装
class User_model extends CI_Model {
public function get_user($id, $status = 'active') {
$this->db->select('id, username, email')
->from('users')
->where('id', $id)
->where('status', $status);
return $this->db->get()->row_array();
}
public function search_users($keyword) {
$this->db->like('username', $keyword);
// 複数カラムの検索
$this->db->or_like(array(
'email' => $keyword,
'first_name' => $keyword
));
return $this->db->get('users')->result_array();
}
}
- トランザクション管理
class Payment_model extends CI_Model {
public function process_payment($user_id, $amount) {
$this->db->trans_start();
try {
// ユーザーの残高更新
$this->db->where('id', $user_id)
->set('balance', 'balance - ' . $amount, FALSE)
->update('users');
// 取引履歴の記録
$this->db->insert('transactions', array(
'user_id' => $user_id,
'amount' => $amount,
'type' => 'payment',
'created_at' => date('Y-m-d H:i:s')
));
$this->db->trans_complete();
return $this->db->trans_status();
} catch (Exception $e) {
$this->db->trans_rollback();
log_message('error', 'Payment processing failed: ' . $e->getMessage());
return FALSE;
}
}
}
セキュリティ対策のベストプラクティス:
- 入力データの検証
- すべてのユーザー入力を信頼しない
- 適切なバリデーションルールの設定
- 特殊文字のエスケープ処理
- エラーハンドリング
- 本番環境での詳細なエラー表示の無効化
- エラーログの適切な管理
- ユーザーへの安全なエラーメッセージの表示
- 定期的なセキュリティ監査
- ログの定期的な確認
- セキュリティアップデートの適用
- 脆弱性スキャンの実施
これらのセキュリティ対策を適切に実装することで、安全なWebアプリケーションを構築することができます。
パフォーマンスを最適化する7つの実践テクニック
キャッシュシステムの効果的な活用方法
CodeIgniter3のキャッシュシステムを活用することで、アプリケーションのパフォーマンスを大幅に向上させることができます。
// キャッシュドライバの設定
$config['cache_driver'] = 'file'; // file, apc, memcached, redis
$config['cache_path'] = APPPATH . 'cache/';
$config['cache_default_expires'] = 3600; // 1時間
// キャッシュの実装例
class Blog extends CI_Controller {
public function view($id) {
$cache_key = "blog_post_{$id}";
if (!$data = $this->cache->get($cache_key)) {
// キャッシュがない場合はDBから取得
$data = $this->blog_model->get_post_with_comments($id);
// キャッシュに保存(1時間有効)
$this->cache->save($cache_key, $data, 3600);
}
$this->load->view('blog/view', $data);
}
}
キャッシュ戦略の実装:
- ビューキャッシュ
- クエリキャッシュ
- セッションキャッシュ
- APIレスポンスキャッシュ
データベースクエリの最適化とインデックス設計
効率的なデータベース操作は、アプリケーションのパフォーマンスに直接影響します。
- クエリの最適化
class Post_model extends CI_Model {
public function get_recent_posts() {
// インデックスを活用したクエリ
return $this->db
->select('p.*, u.username, c.category_name')
->from('posts p')
->join('users u', 'u.id = p.user_id', 'left')
->join('categories c', 'c.id = p.category_id', 'left')
->where('p.status', 'published')
->order_by('p.created_at', 'DESC')
->limit(10)
->get()
->result_array();
}
}
- インデックス設計
-- 効率的なインデックス設計 ALTER TABLE posts ADD INDEX idx_status_date (status, created_at); ALTER TABLE posts ADD INDEX idx_category (category_id); ALTER TABLE posts ADD INDEX idx_user (user_id);
静的コンテンツの最適化とCDNの活用
静的コンテンツの配信を最適化することで、ページロード時間を短縮できます。
// assets/config.php
$config['assets_path'] = 'https://cdn.example.com/assets/';
$config['assets_version'] = '1.0.0';
// ヘルパー関数
function asset_url($path) {
$ci =& get_instance();
return $ci->config->item('assets_path') . $path . '?v=' . $ci->config->item('assets_version');
}
// ビューでの使用
<link rel="stylesheet" href="<?php echo asset_url('css/style.css'); ?>">
<script src="<?php echo asset_url('js/app.js'); ?>"></script>
非同期処理の実装によるレスポンス改善
重い処理を非同期化することで、ユーザーエクスペリエンスを向上させます。
// 非同期処理用のジョブクラス
class Email_job {
public function send_bulk_emails($user_ids) {
foreach ($user_ids as $user_id) {
$this->send_email($user_id);
// 進捗の記録
$this->update_progress($user_id);
}
}
}
// コントローラでの実装
public function send_newsletter() {
// ジョブをキューに追加
$job_id = $this->queue->push('Email_job', 'send_bulk_emails', [$user_ids]);
// 即座にレスポンスを返す
return $this->response([
'status' => 'queued',
'job_id' => $job_id
]);
}
メモリ使用量の最適化とガベージコレクション
メモリ使用量を最適化し、アプリケーションの安定性を向上させます。
class Large_data_processor {
public function process_csv($file_path) {
// メモリ制限の設定
ini_set('memory_limit', '256M');
// ストリーム処理による大容量ファイルの処理
$handle = fopen($file_path, 'r');
while (($data = fgetcsv($handle)) !== FALSE) {
$this->process_row($data);
// メモリのクリーンアップ
unset($data);
}
fclose($handle);
}
private function process_row($data) {
// 行ごとの処理
$this->db->insert('processed_data', $data);
}
}
ログ管理と監視システムの構築
パフォーマンスの問題を早期に発見し、対応するための監視システムを構築します。
// カスタムログライブラリ
class Performance_logger {
public function log_request($start_time) {
$end_time = microtime(true);
$execution_time = $end_time - $start_time;
$log_data = [
'uri' => $this->CI->uri->uri_string(),
'method' => $this->CI->input->method(),
'execution_time' => $execution_time,
'memory_usage' => memory_get_usage(),
'timestamp' => date('Y-m-d H:i:s')
];
$this->CI->db->insert('performance_logs', $log_data);
}
}
// アプリケーションフックでの使用
$hook['post_controller'] = array(
'class' => 'Performance_logger',
'function' => 'log_request',
'filename' => 'Performance_logger.php',
'filepath' => 'hooks'
);
負荷テストとボトルネックの特定手法
アプリケーションの性能を測定し、改善ポイントを特定します。
- プロファイリングの有効化
// プロファイラの設定
$this->output->enable_profiler(TRUE);
// 特定のセクションのみプロファイリング
$sections = array(
'benchmarks' => TRUE,
'database' => TRUE,
'queries' => TRUE,
'memory_usage' => TRUE
);
$this->output->set_profiler_sections($sections);
- パフォーマンス測定のためのベンチマーク
class Performance_test extends CI_Controller {
public function run_benchmark() {
// ベンチマークポイントの設定
$this->benchmark->mark('code_start');
// テスト対象の処理
$this->heavy_process();
$this->benchmark->mark('code_end');
// 実行時間の計測
$execution_time = $this->benchmark->elapsed_time('code_start', 'code_end');
echo "Execution time: {$execution_time} seconds";
}
}
パフォーマンス最適化のベストプラクティス:
- 定期的なモニタリング
- サーバーリソースの使用状況
- レスポンスタイム
- エラー率
- キャッシュヒット率
- 段階的な最適化
- ボトルネックの特定
- 優先順位付け
- 効果測定
- 継続的な改善
- 負荷テストの実施
- 異なる負荷パターンでのテスト
- エッジケースの検証
- スケーラビリティの確認
これらの最適化テクニックを適切に組み合わせることで、高性能なCodeIgniter3アプリケーションを実現できます。
実践的なCodeIgniter3プロジェクトの具体例
ECサイトの開発事例とアーキテクチャ設計
実際のECサイト開発を例に、CodeIgniter3での実装方法を説明します。
- プロジェクト構造
application/
├── controllers/
│ ├── Shop.php
│ ├── Cart.php
│ ├── Order.php
│ └── Payment.php
├── models/
│ ├── Product_model.php
│ ├── Cart_model.php
│ ├── Order_model.php
│ └── Payment_model.php
├── views/
│ ├── shop/
│ │ ├── product_list.php
│ │ └── product_detail.php
│ ├── cart/
│ │ ├── cart.php
│ │ └── checkout.php
│ └── order/
│ ├── confirm.php
│ └── complete.php
└── libraries/
├── Payment_gateway.php
└── Cart_manager.php
- 商品管理システムの実装
// controllers/Shop.php
class Shop extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model('product_model');
$this->load->library('cart_manager');
}
public function product($id) {
$data['product'] = $this->product_model->get_with_details($id);
$data['related_products'] = $this->product_model->get_related($id);
$data['stock_status'] = $this->product_model->check_stock($id);
$this->load->view('shop/product_detail', $data);
}
}
// models/Product_model.php
class Product_model extends CI_Model {
public function get_with_details($id) {
return $this->db
->select('p.*, c.name as category_name, COUNT(r.id) as review_count')
->from('products p')
->join('categories c', 'c.id = p.category_id')
->join('reviews r', 'r.product_id = p.id', 'left')
->where('p.id', $id)
->group_by('p.id')
->get()
->row_array();
}
}
- 注文処理システム
// libraries/Cart_manager.php
class Cart_manager {
private $CI;
public function __construct() {
$this->CI =& get_instance();
$this->CI->load->library('session');
}
public function add_item($product_id, $quantity) {
// 在庫チェック
if (!$this->check_stock($product_id, $quantity)) {
return FALSE;
}
// カート追加処理
$cart_data = $this->CI->session->userdata('cart') ?: [];
$cart_data[$product_id] = [
'quantity' => ($cart_data[$product_id]['quantity'] ?? 0) + $quantity,
'added_at' => date('Y-m-d H:i:s')
];
$this->CI->session->set_userdata('cart', $cart_data);
return TRUE;
}
}
REST APIの実装とマイクロサービスとの連携
CodeIgniter3でRESTful APIを実装し、マイクロサービスと連携する例を示します。
- REST APIコントローラー
// controllers/api/Products.php
class Products extends REST_Controller {
public function __construct() {
parent::__construct();
$this->load->model('product_model');
}
public function index_get() {
$products = $this->product_model->get_all();
$this->response($products, 200);
}
public function stock_post() {
$product_id = $this->post('product_id');
$quantity = $this->post('quantity');
if ($this->product_model->update_stock($product_id, $quantity)) {
$this->response(['status' => 'success'], 200);
} else {
$this->response(['status' => 'error'], 400);
}
}
}
- マイクロサービス連携
// libraries/Inventory_service.php
class Inventory_service {
private $base_url;
private $api_key;
public function __construct() {
$this->CI =& get_instance();
$this->base_url = $this->CI->config->item('inventory_api_url');
$this->api_key = $this->CI->config->item('inventory_api_key');
}
public function check_stock($product_id) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "{$this->base_url}/stock/{$product_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-KEY: {$this->api_key}",
"Accept: application/json"
]
]);
$response = curl_exec($curl);
curl_close($curl);
return json_decode($response, true);
}
}
レガシーシステムのリファクタリング手法
レガシーなCodeIgniter3システムを段階的に改善する方法を解説します。
- 依存性注入の導入
// libraries/DI_Container.php
class DI_Container {
private $services = [];
public function register($name, $callback) {
$this->services[$name] = $callback;
}
public function resolve($name) {
if (!isset($this->services[$name])) {
throw new Exception("Service not found: {$name}");
}
return $this->services[$name]();
}
}
// application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
protected $container;
public function __construct() {
parent::__construct();
$this->container = new DI_Container();
$this->register_services();
}
private function register_services() {
$this->container->register('product_service', function() {
$model = new Product_model();
$cache = new Cache_service();
return new Product_service($model, $cache);
});
}
}
- リポジトリパターンの実装
// repositories/Product_repository.php
interface ProductRepositoryInterface {
public function findById($id);
public function findByCategory($category_id);
public function save(array $data);
}
class ProductRepository implements ProductRepositoryInterface {
private $db;
public function __construct(CI_DB $db) {
$this->db = $db;
}
public function findById($id) {
return $this->db
->where('id', $id)
->get('products')
->row_array();
}
}
- サービスレイヤーの追加
// services/Order_service.php
class Order_service {
private $order_repository;
private $payment_service;
private $inventory_service;
public function __construct(
OrderRepositoryInterface $order_repository,
PaymentServiceInterface $payment_service,
InventoryServiceInterface $inventory_service
) {
$this->order_repository = $order_repository;
$this->payment_service = $payment_service;
$this->inventory_service = $inventory_service;
}
public function process_order($order_data) {
$this->db->trans_start();
try {
// 在庫チェック
if (!$this->inventory_service->check_stock($order_data['product_id'])) {
throw new OutOfStockException();
}
// 支払い処理
$payment_result = $this->payment_service->process($order_data['payment']);
if (!$payment_result['success']) {
throw new PaymentFailedException();
}
// 注文保存
$order_id = $this->order_repository->save($order_data);
$this->db->trans_complete();
return $order_id;
} catch (Exception $e) {
$this->db->trans_rollback();
throw $e;
}
}
}
これらの実装例は、以下のような利点を提供します:
- スケーラビリティの向上
- マイクロサービスアーキテクチャによる分散処理
- 効率的なリソース管理
- 独立したデプロイメント
- メンテナンス性の向上
- 明確な責務分離
- テスタビリティの向上
- コードの再利用性
- パフォーマンスの最適化
- キャッシュ戦略の実装
- 非同期処理の活用
- 効率的なデータベースアクセス
これらの実践例を参考に、プロジェクトの要件に応じた最適なアーキテクチャを選択することができます。
CodeIgniter3の運用保守と将来性
バージョンアップと互換性の維持
CodeIgniter3システムを長期的に運用していく上で、バージョンアップと互換性の維持は重要な課題です。
- バージョンアップの基本戦略
// バージョン管理用のユーティリティクラス
class Version_manager {
private $CI;
public function __construct() {
$this->CI =& get_instance();
$this->CI->load->database();
}
public function check_version() {
$current_version = $this->get_current_version();
$latest_version = $this->get_latest_version();
if ($current_version < $latest_version) {
return [
'needs_upgrade' => true,
'current' => $current_version,
'latest' => $latest_version,
'upgrades' => $this->get_pending_upgrades($current_version)
];
}
return ['needs_upgrade' => false];
}
private function get_pending_upgrades($current_version) {
return $this->db
->where('version >', $current_version)
->order_by('version', 'ASC')
->get('system_upgrades')
->result_array();
}
}
// アップグレードスクリプトの例
class Upgrade_manager {
public function run_upgrade($version) {
$method = 'upgrade_to_' . str_replace('.', '_', $version);
if (method_exists($this, $method)) {
return $this->$method();
}
return false;
}
private function upgrade_to_3_1_12() {
// データベーススキーマの更新
$this->db->query('ALTER TABLE users ADD COLUMN last_login DATETIME');
// 設定ファイルの更新
$this->update_config_file();
return true;
}
}
- 互換性テストの実装
class Compatibility_test extends CI_Controller {
public function run_tests() {
$this->load->library('unit_test');
// 基本機能のテスト
$this->test_database_connections();
$this->test_session_handling();
$this->test_custom_libraries();
// レガシー機能のテスト
$this->test_deprecated_functions();
echo $this->unit->report();
}
private function test_database_connections() {
$this->load->database();
$result = $this->db->simple_query('SELECT 1');
$this->unit->run($result, true, 'Database Connection Test');
}
}
モダンPHP開発手法との統合アプローチ
CodeIgniter3を現代のPHP開発手法と統合する方法を示します。
- Composerの統合
// application/composer.json
{
"require": {
"php": ">=7.3",
"monolog/monolog": "^2.0",
"guzzlehttp/guzzle": "^7.0",
"symfony/var-dumper": "^5.0"
},
"autoload": {
"psr-4": {
"App\\": "application/classes/"
}
}
}
// application/config/config.php
$config['composer_autoload'] = TRUE;
// モダンなクラスの使用例
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class Modern_logger {
private $logger;
public function __construct() {
$this->logger = new Logger('application');
$this->logger->pushHandler(new StreamHandler(
APPPATH . 'logs/modern.log',
Logger::DEBUG
));
}
public function log($message, $level = 'info') {
$this->logger->{$level}($message);
}
}
- PHPUnit統合
// application/tests/TestCase.php
class TestCase extends PHPUnit\Framework\TestCase {
protected $CI;
public function setUp(): void {
parent::setUp();
$this->CI =& get_instance();
}
}
// application/tests/controllers/Shop_test.php
class Shop_test extends TestCase {
public function testProductList() {
$output = $this->request('GET', 'shop/products');
$this->assertResponseCode(200);
$this->assertStringContainsString('Product List', $output);
}
}
CodeIgniter4への移行を見据えた設計方針
将来的なCodeIgniter4への移行を見据えた設計方針を解説します。
- 移行準備のためのアーキテクチャ設計
// 名前空間の導入
namespace App\Services;
class ProductService {
private $product_repository;
public function __construct(ProductRepositoryInterface $repository) {
$this->product_repository = $repository;
}
public function getProductDetails($id) {
return $this->product_repository->findWithDetails($id);
}
}
// インターフェースの活用
namespace App\Interfaces;
interface CacheInterface {
public function get($key);
public function set($key, $value, $ttl = 3600);
public function delete($key);
}
// 移行しやすい構造のコントローラー
class API_Controller extends CI_Controller {
protected function response($data, $status = 200) {
$this->output
->set_content_type('application/json')
->set_status_header($status)
->set_output(json_encode($data));
}
}
- CI4互換のヘルパー関数
// application/helpers/ci4_helper.php
if (!function_exists('service')) {
function service($name) {
$CI =& get_instance();
return $CI->load->library($name);
}
}
if (!function_exists('view')) {
function view($name, $data = []) {
$CI =& get_instance();
return $CI->load->view($name, $data, TRUE);
}
}
移行に向けた主要なポイント:
- コードの整理と改善
- レガシーコードの特定と文書化
- 技術的負債の計画的な解消
- モジュール化の推進
- 移行計画の策定
- 段階的な移行アプローチの検討
- 優先順位付けとリスク評価
- テスト戦略の立案
- チーム育成と知識移転
- CodeIgniter4の学習計画
- 移行手順の文書化
- チームメンバーのスキルアップ
運用保守におけるベストプラクティス:
- 定期的なメンテナンス
- セキュリティアップデートの適用
- パフォーマンスモニタリング
- バックアップと復旧テスト
- ドキュメント管理
- システム構成図の更新
- API仕様書の維持
- 運用手順書の整備
- 継続的な改善
- 技術的負債の管理
- コードレビューの実施
- パフォーマンス最適化
これらの方針に従うことで、現在のCodeIgniter3システムを安定的に運用しながら、将来的なバージョンアップや移行にも対応できる柔軟な設計を実現できます。