フレームワーク

PHP CodeIgniterによるWebアプリ開発について解説

PHPのWebアプリ開発で人気のフレームワークCodeIgniterは、シンプルな設計と軽量な動作が魅力です。

MVCパターンを採用しているため、モデル・ビュー・コントローラの役割分担が明確になり、コードの整理や保守がしやすくなります。

公式ドキュメントや活発なコミュニティもあり、初心者でも安心して導入できる環境が整っています。

CodeIgniterの基本機能

CodeIgniterはシンプルかつ高速なフレームワークで、開発者がWebアプリケーションを効率的に構築できる仕組みを提供しています。

以下では、基本機能に含まれるディレクトリ・ファイル構成およびMVCパターンの仕組みについて説明します。

ディレクトリ・ファイル構成

CodeIgniterでは、主にシステムフォルダとアプリケーションフォルダに機能が分割されています。

各フォルダには特定の役割があり、開発者は必要に応じて設定やコードの追加を行います。

システムフォルダの役割

システムフォルダは、CodeIgniterのコアライブラリや基本的なクラス群が格納された場所です。

このフォルダは通常、変更不要の状態で利用されるため、安定した動作を提供します。

主な内容は以下の通りです。

  • コアクラス群(フレームワークの基本処理)
  • 共通ライブラリ
  • エンジン関連のコード

変更が必要な場合は、アプリケーション側で拡張することでカスタマイズするのが一般的です。

アプリケーションフォルダの構造

アプリケーションフォルダは、ユーザーが作成するコントローラ、モデル、ビューが配置される場所です。

このフォルダ内で、Webアプリケーション独自のロジックや表示部分を管理します。

フォルダ構成は以下のようになっています。

  • コントローラ: ビジネスロジックやユーザーからのリクエストを処理するクラスを格納
  • モデル: データベースやその他のデータ処理を担うクラスが配置
  • ビュー: ユーザーに表示するHTMLテンプレートなどを保持

例えば、簡単なコントローラを作成する場合、Welcome.phpというファイルをアプリケーションのcontrollersフォルダに置くことで自動でルーティングされる仕様です。

MVCパターンの仕組み

CodeIgniterはMVC(Model-View-Controller)パターンに基づいて設計されています。

このパターンは、各役割を明確に分担することでコードの整理および保守性の向上を実現しています。

モデルの役割

モデルは、データベースとのやり取りやビジネスロジックを管理します。

主な役割は次の通りです。

  • データの取得、挿入、更新、削除(CRUD)
  • ビジネスロジックの実装
  • データ検証

以下は、簡単なモデルのサンプルコードです。

<?php
class User_model extends CI_Model {
  // ユーザー情報を取得するメソッド
  public function getUser($user_id) {
    // Active Recordを利用してデータベースからユーザーデータ取得
    $query = $this->db->get_where('users', array('id' => $user_id));
    return $query->row();
  }
}
// 呼び出し例の出力結果
// Userオブジェクトが取得される

ビューの役割

ビューはユーザーに画面を表示するためのテンプレート部分を担当します。

HTMLとPHPを組み合わせ、データを表示しやすく整理する役割があります。

  • 表示用データを整形し、HTMLで表示
  • クライアント側に送るレスポンスの構築

例えば、ビューでは以下のように変数を用いてHTML内にデータを埋め込むことが可能です。

<!-- application/views/user_view.php -->
<html>
  <head>
    <title>User Information</title>
  </head>
  <body>
    <h1><?php echo $user->name; ?></h1>
    <p>Email: <?php echo $user->email; ?></p>
  </body>
</html>

コントローラの役割

コントローラは、リクエストの受信および処理、そしてモデルとビューの連携を管理します。

具体的には、以下の役割を持ちます。

  • ユーザーからのリクエストの受け取り
  • 必要に応じてモデルを呼び出し、データ操作を実行
  • ビューにデータを渡し、表示結果を返す

例えば、以下のサンプルコードでは、User_modelからデータを取得し、ビューに渡す処理を行います。

<?php
class User extends CI_Controller {
  // ユーザー詳細情報を表示するメソッド
  public function detail($user_id) {
    $this->load->model('User_model');
    $data['user'] = $this->User_model->getUser($user_id);
    $this->load->view('user_view', $data);
  }
}
// ユーザー詳細ページが表示される

ルーティングとURL設定

CodeIgniterのルーティング機能は、URLを柔軟に構成し、どのコントローラやメソッドにリクエストを振り分けるかを管理します。

以下では、基本的なルーティング設定およびカスタムルートについて紹介します。

基本ルーティング設定

基本ルーティング設定では、CodeIgniterが標準で提供するルート定義の方法について解説します。

routes.phpに記述することで、URLとコントローラ・メソッドとの対応付けを行います。

ルート定義方法

ルート定義は、application/config/routes.phpファイルに記述します。

デフォルトのルート設定では、以下のような記述がされています。

// application/config/routes.php
$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

これにより、ルートにアクセスがあった場合、Welcomeコントローラのindexメソッドが呼び出されます。

URLパラメータの取り扱い

URLパラメータは、パスの一部として指定される値をコントローラのメソッドに渡す仕組みです。

例えば、以下のようにパラメータを取得できます。

<?php
class Article extends CI_Controller {
  // 記事IDをパラメータとして受け取るメソッド
  public function view($article_id) {
    // $article_idを用いて記事内容取得の処理を実施
    echo "記事ID: " . $article_id;
  }
}
// URLに「article/view/123」とアクセスすると「記事ID: 123」が表示される

カスタムルート

カスタムルートでは、デフォルトのルート定義を拡張し、より柔軟なURL設定を行う方法を紹介します。

セグメントの利用法

セグメントを利用すると、URL内の任意の位置にパラメータを配置することが可能です。

たとえば、複数のセグメントを持つURLの定義は次のように行います。

// application/config/routes.php
$route['blog/(:num)/(:any)'] = 'blog/view/$1/$2';

この設定では、「blog/数字/任意の文字列」の形式のURLを「blog」コントローラのviewメソッドに振り分け、最初のセグメントを12として渡します。

正規表現を用いた設定

CodeIgniterでは正規表現を利用して、より複雑なルーティング不一致の場合のパターンマッチを行うことも可能です。

例えば、以下のような設定が考えられます。

// application/config/routes.php
$route['product/([a-z]+)/(\d+)'] = 'catalog/product_lookup/$1/$2';

この設定では、productの後にアルファベットの文字列と数字が続くURLをcatalogコントローラのproduct_lookupメソッドに転送し、両方の値を引数として渡します。

コントローラの作成と処理

コントローラは、ユーザーのリクエストを受け取り、適切な処理を実行する中心的な役割を果たします。

以下では、コントローラの作成方法と、リクエスト処理時に発生するエラーへの対応を説明します。

コントローラ作成手法

コントローラを作成するには、application/controllersディレクトリに新規ファイルを配置する必要があります。

クラス名やメソッド名は、CodeIgniterの規約に沿うように作成します。

メソッドの定義

各コントローラには、リクエストに対応するメソッドを定義します。

メソッドは、リクエスト毎にデータを処理し、ビューに渡す役割を担います。

例えば、以下のサンプルコードでは、簡単なメソッドを定義しています。

<?php
class Sample extends CI_Controller {
  // indexメソッドは、デフォルトで呼び出される
  public function index() {
    echo "Sample Controller Index Method";
  }
  // showメソッドは、特定の情報を表示
  public function show($data) {
    echo "データ: " . $data;
  }
}
// 「Sample Controller Index Method」または「データ: 値」がブラウザに表示される

データ受け渡し処理

コントローラは、モデルからデータを受け取り、ビューへ引き渡す処理を行います。

以下は、モデルと連携してデータを取得し、ビューに渡す例です。

<?php
class Product extends CI_Controller {
  public function detail($product_id) {
    // モデルを読み込み
    $this->load->model('Product_model');
    // モデルからデータを取得
    $data['product'] = $this->Product_model->getProduct($product_id);
    // ビューにデータを渡す
    $this->load->view('product_detail', $data);
  }
}
// product_detailビューで製品情報が適切に表示される

エラーハンドリングとリダイレクト

エラーハンドリングはユーザーエクスペリエンスの向上に寄与するため、HTTPステータスコードの適切な管理やリダイレクトを実施することが求められます。

HTTPステータスコード管理

CodeIgniterでは、HTTPステータスコードを用いてエラー発生時に適切なレスポンスを返すことができます。

例えば、存在しないページへアクセスされた場合は、404エラーが返されます。

開発者はカスタムエラーページを用意することも可能です。

// エラーハンドリングの一例
if (!$data) {
  // HTTPヘッダーの設定
  show_404();
}

例外処理のポイント

例外処理は、予期せぬエラー発生時に、ユーザーに適切なメッセージを返すために利用されます。

try-catch構文を用いて、例外発生時の処理を明確にします。

<?php
class Order extends CI_Controller {
  public function process($order_id) {
    try {
      // 注文処理の実行
      if (!$this->Order_model->processOrder($order_id)) {
        throw new Exception("注文処理に失敗");
      }
      echo "注文処理が正常に完了しました";
    } catch (Exception $e) {
      // エラーメッセージの表示
      echo "エラー: " . $e->getMessage();
    }
  }
}
// 正常な場合「注文処理が正常に完了しました」、エラー時には「エラー: 注文処理に失敗」が表示される

モデルとデータ操作

モデルは、データベースとのやり取りやデータの管理を担い、アプリケーションのビジネスロジックを実装する重要な部分です。

モデル構築方法

モデルは、application/modelsディレクトリ内で作成され、データ処理の基本となるメソッドが実装されます。

以下では、CRUD処理の実装例とActive Recordの活用例を解説します。

CRUD処理の実装

CRUD(作成、読み取り、更新、削除)処理は、データを扱う上で基本となります。

以下のサンプルでは、新規データの挿入とデータ取得の例を示しています。

<?php
class Product_model extends CI_Model {
  // 新しい製品をデータベースに挿入
  public function addProduct($data) {
    $this->db->insert('products', $data);
    return $this->db->insert_id();
  }
  // 特定の製品をデータベースから取得
  public function getProduct($product_id) {
    $query = $this->db->get_where('products', array('id' => $product_id));
    return $query->row();
  }
}
// addProductメソッドで挿入した場合、新しく作成された製品IDが返される

Active Recordの活用

Active Recordパターンを用いると、SQLクエリをシンプルなメソッドチェーンで記述でき、コードの可読性が向上します。

以下は、Active Recordを活用したサンプルです。

<?php
class Customer_model extends CI_Model {
  // 顧客のリストを取得
  public function getCustomers() {
    // 複数の条件を組み合わせてデータを取得
    $this->db->select('*');
    $this->db->from('customers');
    $this->db->where('status', 'active');
    $query = $this->db->get();
    return $query->result();
  }
}
// 結果として、アクティブな顧客データの配列が返される

データベース接続設定

データベースへの接続設定は、アプリケーション全体で共通の設定を行い、効率的なデータ操作を実現します。

設定ファイルの調整

データベース接続情報は、application/config/database.phpに記述します。

ここで、ホスト名、ユーザー名、パスワード、データベース名などを設定します。

設定例は以下の通りです。

// application/config/database.php内の設定例
$db['default'] = array(
  'dsn'	=> '',
  'hostname' => 'localhost',
  'username' => 'db_user',
  'password' => 'db_pass',
  'database' => 'db_name',
  'dbdriver' => 'mysqli',
  // その他の設定項目
);

複数データベースの利用方法

場合によっては、複数のデータベースに接続する必要がある場合もあります。

CodeIgniterは、複数の設定を用意し、必要に応じて接続を切り替えることが可能です。

<?php
class MultiDB_model extends CI_Model {
  public function getData() {
    // 「default」と「secondary」という2つのデータベースグループを利用する例
    $defaultDB = $this->load->database('default', TRUE);
    $secondaryDB = $this->load->database('secondary', TRUE);
    // defaultDBでのデータ取得処理
    $query = $defaultDB->get('table1');
    // secondaryDBでのデータ取得処理
    $query2 = $secondaryDB->get('table2');
    return array('table1' => $query->result(), 'table2' => $query2->result());
  }
}
// 両方のテーブルから取得した結果が配列で返される

ビューの設計とデータ表示

ビューは、ユーザーに情報を視覚的に提供する部分であり、テンプレートの分割やデータの反映が重要となります。

テンプレート構成

ビューは、全体のレイアウトを統一するために分割して作成されます。

ヘッダー、フッター、サイドバーなどの共通部分をパーシャルビューとして利用することで、再利用性が向上します。

レイアウト分割の方法

レイアウト分割では、共通部分を別ファイルに記述し、必要に応じて各ビューで読み込みます。

例えば、以下のようにヘッダーとフッターを分割します。

<!-- application/views/templates/header.php -->
<html>
  <head>
    <title><?php echo $title; ?></title>
  </head>
  <body>
<!-- application/views/templates/footer.php -->
  </body>
</html>

そして、各ページのビューでこれらを読み込み、全体レイアウトを構築します。

<!-- application/views/page_view.php -->
<?php $this->load->view('templates/header', array('title' => 'Page Title')); ?>
<div>
  <h1>ページ本文</h1>
  <p>ここにコンテンツが入ります。</p>
</div>
<?php $this->load->view('templates/footer'); ?>

パーシャルビューの利用

パーシャルビューは、共通のコンポーネントを部品化したもので、複数のビューで再利用可能です。

これにより、変更があった場合にも1か所のみ修正すればよいというメリットがあります。

<!-- application/views/partials/menu.php -->
<ul>
  <li><a href="/home">ホーム</a></li>
  <li><a href="/about">アバウト</a></li>
  <li><a href="/contact">コンタクト</a></li>
</ul>

利用する際は、以下のように読み込みます。

<?php $this->load->view('partials/menu'); ?>

データ表示処理

ビュー内にPHPコードとHTMLを連携させることで、柔軟なデータ表示が可能になります。

変数受け渡しの方法

コントローラから渡されるデータは、ビュー内で変数として利用可能です。

以下の例では、コントローラから配列で渡されたデータを利用し、情報を表示しています。

<!-- application/views/customer_view.php -->
<html>
  <head>
    <title>顧客情報</title>
  </head>
  <body>
    <h1><?php echo $customer->name; ?></h1>
    <p>メールアドレス: <?php echo $customer->email; ?></p>
  </body>
</html>

PHPコードとHTMLの連携手法

PHPコードとHTMLを連携させる際は、可読性を意識して記述することが重要です。

たとえば、条件分岐やループ処理を用いる場合、以下のサンプルコードのように記述できます。

<!-- application/views/product_list.php -->
<html>
  <head>
    <title>製品リスト</title>
  </head>
  <body>
    <h1>製品一覧</h1>
    <ul>
      <?php foreach ($products as $product): ?>
        <li><?php echo $product->name; ?> - <?php echo $product->price; ?></li>
      <?php endforeach; ?>
    </ul>
  </body>
</html>
// ブラウザ上には、製品名と価格のリストが表示される

ライブラリとヘルパーの利用

CodeIgniterでは、標準ライブラリやヘルパー関数を利用することで、よくある処理の実装を簡略化できます。

さらに、独自ライブラリを作成して機能拡張することも可能です。

標準ライブラリの活用

CodeIgniterの標準ライブラリは、多数の共通処理を提供しており、簡単に利用できるようになっています。

例えば、セッション管理やメール送信などが含まれます。

ライブラリのロード方法

ライブラリは、コントローラ内で必要なものをロードし使用します。

以下は、セッションライブラリの例です。

<?php
class SessionTest extends CI_Controller {
  public function index() {
    // セッションライブラリをロード
    $this->load->library('session');
    // セッションにデータを追加
    $this->session->set_userdata('user', array('name' => 'Taro', 'role' => 'admin'));
    echo "セッションにユーザーデータをセットしました";
  }
}
// ブラウザ上に「セッションにユーザーデータをセットしました」と表示される

ヘルパー関数の呼び出し方法

ヘルパーは、簡単な関数群を提供しており、共通のタスクを迅速に実施するために利用されます。

例えば、URLヘルパーはURLの生成を補助します。

<?php
// URLヘルパーをロード
$this->load->helper('url');
$baseUrl = base_url();
// $baseUrlにサイトの基本URLが格納される

カスタム拡張の実装

必要に応じて、独自のライブラリを作成し、CodeIgniterの機能を拡張することが可能です。

また、フレームワークのフック機能を利用すれば処理の前後に独自のロジックを挿入できます。

独自ライブラリの作成

独自ライブラリを作成する場合、application/librariesディレクトリに新規ファイルを作成し、クラスを定義します。

<?php
class CustomLogger {
  // ログ出力用のメソッド
  public function logMessage($message) {
    // ファイルにログを書き込む例
    file_put_contents('./logs/app.log', date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND);
  }
}

コントローラで利用する際は、以下のようにロードして呼び出します。

<?php
class LogTest extends CI_Controller {
  public function index() {
    // カスタムライブラリをロード
    $this->load->library('CustomLogger');
    $this->customlogger->logMessage("ログテストを実行しました");
    echo "ログが記録されました";
  }
}
// ブラウザ上に「ログが記録されました」と表示され、ログファイルに記録される

フック機能の使用例

フック機能は、CodeIgniterの処理フローに対して前処理あるいは後処理のコードを挿入する仕組みです。

設定はapplication/config/hooks.phpで行います。

例えば、全コントローラ実行前に共通処理を追加する場合、以下のように記述できる例です。

// application/config/hooks.php
$hook['pre_controller'] = array(
  'class'    => 'MyPreControllerHook',
  'function' => 'checkAccess',
  'filename' => 'MyPreControllerHook.php',
  'filepath' => 'hooks'
);

そして、application/hooks/MyPreControllerHook.phpにフック処理を実装します。

<?php
class MyPreControllerHook {
  public function checkAccess() {
    // 必要なアクセス制御処理を実装
    // 例:特定IPからのアクセスを制限する場合の処理
    if ($_SERVER['REMOTE_ADDR'] === '拒否IPアドレス') {
      exit("アクセス禁止");
    }
  }
}
// 特定のIPからのアクセス時に「アクセス禁止」と表示される

セキュリティとパフォーマンス対策

Webアプリケーションの安全性およびパフォーマンス向上のため、CodeIgniterでは複数の仕組みを提供しています。

以下では、入力データの検証や、キャッシュ設定について説明します。

入力データ検証と安全対策

入力データの検証は、SQLインジェクションやXSS攻撃などを防ぐために必須の対策です。

CodeIgniterでは、セキュリティフィルタリングやCSRF保護の機能が標準で提供されています。

セキュリティフィルタリングの実施

フォームから入力されたデータは、必要に応じてフィルタリングし、不正な入力を除去します。

以下は、入力データを処理する例です。

<?php
class FormData extends CI_Controller {
  public function submit() {
    // ヘルパーの読み込み
    $this->load->helper('security');
    // 入力データの取得とフィルタリング
    $name = $this->input->post('name', TRUE);
    $email = $this->input->post('email', TRUE);
    echo "Name: " . html_escape($name) . "<br>";
    echo "Email: " . html_escape($email);
  }
}
// ユーザーが入力した名前とメールアドレスがエスケープされた状態で表示される

CSRF保護とセッション管理

CodeIgniterは、CSRFトークンを用いた保護機能を提供しており、フォームに自動でトークンを埋め込む仕組みを持っています。

また、セッション管理機能を利用して、ユーザー認証情報を安全に保持できます。

設定はapplication/config/config.php内のフラグで有効化できます。

キャッシュ管理と最適化

パフォーマンス向上のためには、キャッシュ機能の利用が有効です。

CodeIgniterでは、ページキャッシュやクエリキャッシュの仕組みが簡単に利用できるよう設計されています。

キャッシュ設定の方法

コントローラ内でキャッシュを設定することが可能です。

以下は、ページ全体のキャッシュを設定する方法の一例です。

<?php
class CacheTest extends CI_Controller {
  public function index() {
    // ページを30秒間キャッシュ
    $this->output->cache(30);
    echo "キャッシュが有効なページです";
  }
}
// 初回アクセス後、30秒間キャッシュされたページが返される

パフォーマンス向上のポイント

パフォーマンスを向上させるためには、以下のポイントが重要です。

  • 不要なデータベースクエリの削減
  • 適切なキャッシュ戦略の導入
  • リソースの圧縮(CSS、JavaScriptなど)

これらの手法を組み合わせることで、安定した動作と高速なレスポンスが実現されます。

まとめ

この記事では、CodeIgniterの基本機能、ディレクトリ構成、MVCパターン、ルーティング、コントローラ・モデル・ビューの役割や各種設定、セキュリティ・パフォーマンス対策について実例を交えながら解説しました。

全体を通して、各機能の連携と設定方法が明確に整理され、実装の流れが理解しやすくなっていると感じられる内容です。

ぜひ、今回の知識を活かして、実際の開発現場で新たな挑戦を始めてみてください。

Back to top button
目次へ