<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CodeIgniter  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/category/web/php/codeigniter/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 09 Dec 2025 01:28:26 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>CodeIgniter  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>CodeIgniter 4のフック（Hooks）を徹底解説！</title>
		<link>https://blog.takeho.com/a-thorough-explanation-of-codeigniter-4-hooks/</link>
					<comments>https://blog.takeho.com/a-thorough-explanation-of-codeigniter-4-hooks/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Thu, 26 Jun 2025 14:41:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[フック]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1139</guid>

					<description><![CDATA[CodeIgniter 4は、軽量かつ高速なPHPフレームワークとして知られていますが、ただシンプルなだけでなく、柔軟性の高い設計が魅力のひとつです。その中でも、「フック（Hooks）」という機能は、システムの各所に任意 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CodeIgniter 4は、軽量かつ高速なPHPフレームワークとして知られていますが、ただシンプルなだけでなく、柔軟性の高い設計が魅力のひとつです。その中でも、「フック（Hooks）」という機能は、システムの各所に任意の処理を差し込むことができる非常に強力な拡張機構です。</p>



<p>この記事では、CodeIgniter 4のHooksについて以下の観点から詳しく解説します。</p>



<ul class="wp-block-list">
<li>フックの基本概念と役割</li>



<li>使用できるイベントの一覧とタイミング</li>



<li>実用的なサンプルコード</li>



<li>サービスプロバイダを活用した高度なフック管理</li>



<li>実運用における注意点とベストプラクティス</li>
</ul>



<p>初心者の方はもちろん、すでにCodeIgniter 4を業務で利用している中級者以上の方にも、実践的な活用のヒントとなる内容を網羅的に解説します。</p>



<h3 class="wp-block-heading"><span id="toc1">フックとは何か？CodeIgniterにおける位置づけ</span></h3>



<p>フックとは、CodeIgniterのライフサイクルの特定ポイントに処理を追加できる仕組みです。たとえば、「すべてのリクエストが来る前にIP制限をかけたい」「コントローラが実行される直前にログ出力したい」といったニーズに対して、コアコードを汚さずスマートに対応できます。</p>



<p>CodeIgniter 3では、<code>application/config/hooks.php</code>に配列形式で記述するややレガシーな形式でしたが、CodeIgniter 4ではよりモダンに、イベントベースでの登録が可能になりました。これにより、PHPのオブジェクト指向的な設計とも親和性が高まり、テスト可能なコード設計も容易になります。</p>



<h3 class="wp-block-heading"><span id="toc2">利用可能なイベント一覧と活用例</span></h3>



<p>CodeIgniter 4では、以下のようなイベントが用意されており、アプリケーションの特定のタイミングで処理を挟むことが可能です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>イベント名</th><th>発火タイミング</th><th>主な用途・使用例</th></tr><tr><td>pre_system</td><td>システム初期化直後（LoggerやConfig未使用）</td><td>IP制限・メンテナンスモードの設定など超初期の処理</td></tr><tr><td>post_system</td><td>最終出力の直前（レスポンス確定前）</td><td>レスポンスへのヘッダー追加、ログ出力、出力内容の加工</td></tr><tr><td>pre_controller</td><td>コントローラメソッド実行直前</td><td>認証・認可処理、グローバル変数のセット、セッション検証</td></tr><tr><td>post_controller_constructor</td><td>コントローラのコンストラクタ直後</td><td>コントローラの初期化ログ出力、パラメータの加工処理</td></tr><tr><td>post_controller</td><td>コントローラ処理の終了後（レスポンス処理前）</td><td>レスポンス加工、パフォーマンス計測、例外監視処理</td></tr><tr><td>display_override</td><td>出力処理を完全に上書きする</td><td>HTML出力の置換、テンプレート全体のカスタマイズ（CLI非対応）</td></tr><tr><td>cache_override</td><td>キャッシュ機構を上書きしたい時</td><td>オリジナルのキャッシュ制御を使う必要があるとき</td></tr><tr><td>database_query</td><td>任意のSQLクエリ発行のたびに発火</td><td>クエリログ出力、SQL監視ツールとの連携、監査用途</td></tr><tr><td>email_send</td><td>Email::send() 実行後</td><td>メール送信ログ記録、外部APIへの連携通知など</td></tr><tr><td>migrations_start</td><td>マイグレーションの処理開始時</td><td>マイグレーション実行履歴の記録、メンテ通知の準備</td></tr><tr><td>migrations_end</td><td>マイグレーションの処理完了時</td><td>実行完了ログ、Slack通知などのアクション実行</td></tr><tr><td>seeds_start</td><td>シーダー処理開始</td><td>テスト環境の初期化ログ出力、外部データ取り込み準備</td></tr><tr><td>seeds_end</td><td>シーダー処理完了</td><td>シード完了通知、データ整合性チェックの実行</td></tr></tbody></table></figure>



<p>これらのイベントに対してフックを登録することで、アプリケーション全体の挙動を柔軟にカスタマイズできます。</p>



<h3 class="wp-block-heading"><span id="toc3">実践：IPアドレスによるアクセス制限のフックを実装</span></h3>



<p>以下に、特定のIP以外からのアクセスを拒否するシンプルなフックの例を紹介します。</p>



<p><code>app/Hooks/CheckIPHook.php</code></p>



<pre class="wp-block-code"><code>namespace App\Hooks;

class CheckIPHook
{
    public static function check()
    {
        $allowedIPs = &#91;'127.0.0.1', '192.168.0.1'];
        $clientIP = $_SERVER&#91;'REMOTE_ADDR'] ?? '0.0.0.0';

        if (!in_array($clientIP, $allowedIPs)) {
            http_response_code(403);
            exit('Access denied for IP: ' . $clientIP);
        }
    }
}</code></pre>



<p>このフックをイベントに登録します：</p>



<p><code>app/Config/Events.php</code></p>



<pre class="wp-block-code"><code>use App\Hooks\CheckIPHook;
use CodeIgniter\Events\Events;

Events::on('pre_system', &#91;CheckIPHook::class, 'check']);</code></pre>



<p>このように登録することで、アプリケーション全体でIP制限が適用されます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc4">実践：すべてのレスポンスにカスタムヘッダーを追加</span></h3>



<p><code>X-App-Version</code>という独自ヘッダーをレスポンスに追加する例です。</p>



<p><code>app/Hooks/AddHeaderHook.php</code></p>



<pre class="wp-block-code"><code>namespace App\Hooks;

class AddHeaderHook
{
    public static function apply()
    {
        header('X-App-Version: 1.0.0');
    }
}</code></pre>



<p><code>app/Config/Events.php</code></p>



<pre class="wp-block-code"><code>use App\Hooks\AddHeaderHook;

Events::on('post_system', &#91;AddHeaderHook::class, 'apply']);</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc5">応用：サービスプロバイダでのフック登録</span></h3>



<p>イベント登録を<code>Events.php</code>にベタ書きするのではなく、サービスプロバイダを使うことで管理しやすくなります。</p>



<p><code>app/Providers/HookEventProvider.php</code></p>



<pre class="wp-block-code"><code>namespace App\Providers;

use CodeIgniter\Events\EventsInterface;
use CodeIgniter\Service\ServiceProvider;
use App\Hooks\CheckIPHook;
use App\Hooks\AddHeaderHook;

class HookEventProvider extends ServiceProvider
{
    public function register(): void {}

    public function boot(EventsInterface $events): void
    {
        $events-&gt;on('pre_system', &#91;CheckIPHook::class, 'check']);
        $events-&gt;on('post_system', &#91;AddHeaderHook::class, 'apply']);
    }
}</code></pre>



<p>このファイルを作成後、<code>Autoload.php</code>の<code>$psr4</code>に追加すれば自動で読み込まれます。</p>



<h3 class="wp-block-heading"><span id="toc6">注意点とベストプラクティス</span></h3>



<h4 class="wp-block-heading"><span id="toc7">注意点</span></h4>



<ul class="wp-block-list">
<li><code>pre_system</code>ではLoggerやConfigが使えません。</li>



<li>header系の出力処理は<code>post_system</code>以前に行う必要があります。</li>



<li>無限ループを招くような処理やエラーハンドリングには慎重な設計が必要です。</li>
</ul>



<h4 class="wp-block-heading"><span id="toc8">ベストプラクティス</span></h4>



<ul class="wp-block-list">
<li>責任の明確な単機能クラス設計（1フック = 1責務）</li>



<li>名前空間で機能ごとに整理する</li>



<li>環境（開発／本番）に応じた動作切り替えを意識する</li>



<li>テスト用・開発用フックは明示的にON/OFF制御できるようにする</li>
</ul>



<h3 class="wp-block-heading"><span id="toc9">まとめ</span></h3>



<p>CodeIgniter 4のHooks機能は、フレームワークの処理に柔軟に介入する強力な仕組みです。Filterのようなルーティングベースの仕組みよりも、より低レベルでの制御が可能なため、セキュリティ・ロギング・バージョン管理・外部連携などさまざまなニーズに対応できます。</p>



<p>うまく使えば、処理の重複を避けてDRYなコードを実現できますが、設計や依存の整理を怠るとトラブルの原因にもなります。責任範囲を明確にしたフック設計を心がけ、CodeIgniterの柔軟なイベントシステムを最大限活用していきましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/a-thorough-explanation-of-codeigniter-4-hooks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CodeIgniter4のEntityとは？存在意義と実践的な活用法を徹底解説！</title>
		<link>https://blog.takeho.com/what-is-entity-in-ci4-a-thorough-explanation-of-its-significance-and-practical-use/</link>
					<comments>https://blog.takeho.com/what-is-entity-in-ci4-a-thorough-explanation-of-its-significance-and-practical-use/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sat, 01 Mar 2025 16:25:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=720</guid>

					<description><![CDATA[目次 Entityの存在意義と役割Entityとは？なぜEntityを使うのか？Entityの使用例Entityクラスの作成Entityをモデルと組み合わせるコントローラーでの使用例データ取得時の活用Entityを使わな [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4"><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Entityの存在意義と役割</a><ol><li><a href="#toc2" tabindex="0">Entityとは？</a></li><li><a href="#toc3" tabindex="0">なぜEntityを使うのか？</a></li></ol></li><li><a href="#toc4" tabindex="0">Entityの使用例</a><ol><li><a href="#toc5" tabindex="0">Entityクラスの作成</a></li><li><a href="#toc6" tabindex="0">Entityをモデルと組み合わせる</a></li><li><a href="#toc7" tabindex="0">コントローラーでの使用例</a></li><li><a href="#toc8" tabindex="0">データ取得時の活用</a></li></ol></li><li><a href="#toc9" tabindex="0">Entityを使わない場合との比較</a><ol><li><a href="#toc10" tabindex="0">Entityなし（配列ベースの管理）</a></li><li><a href="#toc11" tabindex="0">Entityあり</a></li></ol></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Entityの存在意義と役割</span></h2>



<h3 class="wp-block-heading"><span id="toc2">Entityとは？</span></h3>



<p>CodeIgniter4の<strong>Entity</strong>は、データベースから取得したデータを<strong>オブジェクト指向的に操作</strong>するための仕組みです。単なる配列やstdClassではなく、<strong>データのバリデーション・整形・ミューテーション</strong>を簡単に行えるのが特徴です。</p>



<h3 class="wp-block-heading"><span id="toc3">なぜEntityを使うのか？</span></h3>



<ul class="wp-block-list">
<li><strong>データの一貫性を保つ</strong><br>直接データを変更するのではなく、Entityを介して操作することで、バリデーションや加工処理を統一できる。</li>



<li><strong>getter/setterの活用で安全性を向上</strong><br><code>getFullName()</code> のようなカスタムメソッドを作成できるため、ロジックを一元管理しやすい。</li>



<li><strong>データのミューテーション（変換）</strong><br><code>setPassword()</code> でパスワードのハッシュ化を自動化するなど、データ変換を簡単に実装できる。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc4">Entityの使用例</span></h2>



<h3 class="wp-block-heading"><span id="toc5">Entityクラスの作成</span></h3>



<p>まずは、<code>app/Entities/User.php</code> にEntityクラスを作成します。</p>



<pre class="wp-block-code"><code>namespace App\Entities;

use CodeIgniter\Entity\Entity;

class User extends Entity
{
    // 自動的にキャストするフィールド
    protected $attributes = &#91;
        'id'       => null,
        'username' => null,
        'email'    => null,
        'password' => null,
    ];

    // パスワードのハッシュ化
    public function setPassword(string $password)
    {
        $this->attributes&#91;'password'] = password_hash($password, PASSWORD_DEFAULT);
        return $this;
    }

    // フルネームを取得する例（仮）
    public function getFullName()
    {
        return $this->attributes&#91;'first_name'] . ' ' . $this->attributes&#91;'last_name'];
    }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc6">Entityをモデルと組み合わせる</span></h3>



<p>次に、Entityを利用するために、<code>UserModel</code> にEntityクラスを設定します。</p>



<pre class="wp-block-code"><code>namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table = 'users';
    protected $primaryKey = 'id';
    
    protected $returnType = 'App\Entities\User'; // ここでEntityを指定する
    protected $allowedFields = &#91;'username', 'email', 'password'];

    // 自動的にタイムスタンプを更新
    protected $useTimestamps = true;
}</code></pre>



<h3 class="wp-block-heading"><span id="toc7">コントローラーでの使用例</span></h3>



<pre class="wp-block-code"><code>use App\Models\UserModel;
use App\Entities\User;

$userModel = new UserModel();

// 新しいユーザーの作成
$user = new User();
$user->username = 'testuser';
$user->email = 'test@example.com';
$user->setPassword('securepassword');

$userModel->save($user);</code></pre>



<p><code>setPassword()</code> を呼ぶことで、自動的にパスワードをハッシュ化できます。</p>



<h3 class="wp-block-heading"><span id="toc8">データ取得時の活用</span></h3>



<pre class="wp-block-code"><code>$user = $userModel->find(1);
echo $user->getFullName(); // フルネームを取得</code></pre>



<h2 class="wp-block-heading"><span id="toc9">Entityを使わない場合との比較</span></h2>



<h3 class="wp-block-heading"><span id="toc10">Entityなし（配列ベースの管理）</span></h3>



<pre class="wp-block-code"><code>$data = &#91;
    'username' => 'testuser',
    'email' => 'test@example.com',
    'password' => password_hash('securepassword', PASSWORD_DEFAULT),
];

$userModel->insert($data);</code></pre>



<p>この方法でも保存は可能ですが、<strong>ロジックをコントローラーに書いてしまうため、コードの再利用性や可読性が低下</strong>します。</p>



<h3 class="wp-block-heading"><span id="toc11">Entityあり</span></h3>



<p>Entityを使用すると、バリデーションやデータ変換を統一でき、<strong>オブジェクト指向的に管理</strong>できるため、<strong>スッキリしたコード</strong>が書けます。</p>



<h2 class="wp-block-heading"><span id="toc12">まとめ</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>項目</td><td>Entityを使用しない場合</td><td>Entityを使用する場合</td></tr><tr><td>データ管理方法</td><td>配列やstdClassで管理</td><td>オブジェクトとして管理</td></tr><tr><td>データの変換</td><td>コントローラー側で行う</td><td>Entity内で統一管理</td></tr><tr><td>バリデーション</td><td>コントローラーにロジックを書く</td><td>Entity内で完結</td></tr><tr><td>可読性・再利用性</td><td>コードが散らばりやすい</td><td>一箇所に集約される</td></tr></tbody></table></figure>



<p>Entityを使うことで、データをオブジェクトとして扱い、バリデーションや整形を一元管理できるため、よりクリーンなコードを実現できます！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/what-is-entity-in-ci4-a-thorough-explanation-of-its-significance-and-practical-use/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CodeIgniter3で複雑化するMVCを救う！HMVC導入で開発効率を大幅にアップ！！</title>
		<link>https://blog.takeho.com/the-introduction-of-hmvc-greatly-improves-development-efficiency/</link>
					<comments>https://blog.takeho.com/the-introduction-of-hmvc-greatly-improves-development-efficiency/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 14:09:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[HMVC]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=621</guid>

					<description><![CDATA[CodeIgniter3を使い続ける中で、複雑化するMVC構成に頭を抱えていませんか？私もその一人でした。しかし、HMVCという救世主に出会い、既存のModelを活かしながら効率的な開発環境を手に入れました。このブログで [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CodeIgniter3を使い続ける中で、複雑化するMVC構成に頭を抱えていませんか？私もその一人でした。しかし、HMVCという救世主に出会い、既存のModelを活かしながら効率的な開発環境を手に入れました。このブログでは、その導入の背景と手順を詳しく解説します。</p>



<h2 class="wp-block-heading">背景</h2>



<p>現在、私が運用しているプロジェクトは、CodeIgniter3をベースにした中規模なウェブアプリケーションです。初期の頃はMVC構成で十分だったものの、機能追加やページ数の増加とともに、コントローラーやビューが肥大化し、保守性が低下していきました。</p>



<p>特に、ある機能を別の機能でも使い回したいとき、毎回コピペやincludeを駆使するのは面倒で非効率。そんなときに目を付けたのが「HMVCパターン」でした。</p>



<p>しかし、既存のModelはかなり作り込まれており、ゼロから作り直すのは現実的ではありません。そこで、Modelは既存のものをそのまま使用しつつ、HMVCを導入することでコントローラーとビューをモジュール化し、効率的な開発環境を目指すことにしました。</p>



<h2 class="wp-block-heading">HMVCとは？</h2>



<p>HMVC（Hierarchical Model-View-Controller）は、MVCの各要素をモジュール単位で管理するアーキテクチャです。従来のMVCでは、コントローラー、モデル、ビューがそれぞれ一つのディレクトリに配置されますが、HMVCでは「モジュール」ごとにそれらをグループ化できます。</p>



<p>例えば、<code>application/modules</code>ディレクトリ内に以下のような構造でモジュールを配置します。</p>



<pre class="wp-block-code"><code>application/modules/
  blog/
    controllers/
    views/
    models/
  shop/
    controllers/
    views/
    models/</code></pre>



<p>これにより、特定の機能を独立して管理・再利用できるようになります。</p>



<h2 class="wp-block-heading">導入手順</h2>



<h3 class="wp-block-heading"><strong>ライブラリのダウンロード</strong></h3>



<p>wiredesignzの<code>codeigniter-modular-extensions-hmvc</code>を<a href="https://github.com/wiredesignz/codeigniter-modular-extensions-hmvc">GitHub</a>からダウンロードします。</p>





<a rel="noopener" href="https://github.com/codinghamster/codeigniter-modular-extensions-hmvc" title="GitHub - codinghamster/codeigniter-modular-extensions-hmvc" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://opengraph.githubassets.com/0393c0d6010ad152e95f9166540f50fd0a83853789c62536ad54ba7e9d1722be/codinghamster/codeigniter-modular-extensions-hmvc" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - codinghamster/codeigniter-modular-extensions-hmvc</div><div class="blogcard-snippet external-blogcard-snippet">Contribute to codinghamster/codeigniter-modular-extensions-hmvc development by creating an account on GitHub.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/codinghamster/codeigniter-modular-extensions-hmvc" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>




<h3 class="wp-block-heading"><strong>CodeIgniterへの組み込み</strong></h3>



<p>ダウンロードしたMXディレクトリをapplication/third_partyに配置します。</p>



<p>次にcoreディレクトリにあるMY_Controller.phpとMY_Router.phpを自プロジェクトのapplication/coreにコピーします。</p>



<h3 class="wp-block-heading"><code><strong>config.php</strong></code><strong>を修正</strong></h3>



<p><strong><code>application/config/</code>config.php</strong>を次のように修正します。</p>



<pre class="wp-block-code"><code>$config&#91;'modules_locations'] = array(
    APPPATH.'modules/' => '../modules/',
);</code></pre>



<h3 class="wp-block-heading"><strong>モジュールの作成</strong></h3>



<p>例えば、ブログ機能をモジュールとして作成する場合</p>



<pre class="wp-block-code"><code><code>application/modules/blog/controllers/Blog.php</code></code></pre>



<pre class="wp-block-code"><code><code>application/modules/blog/views/index.php</code></code></pre>



<p>※Modelは既存の<code>application/models</code>内のものを使用</p>



<h3 class="wp-block-heading"><strong>モジュールの利用</strong></h3>



<p>モジュールから別のモジュールを呼び出す際もシンプルです。</p>



<pre class="wp-block-code"><code>$this->load->module('shop/cart');
$this->cart->add_item($item_id);</code></pre>



<h2 class="wp-block-heading">実装のポイント</h2>



<ul class="wp-block-list">
<li><strong>Modelは既存のものをそのまま使用</strong><br>新たにModelを作る必要がないため、導入コストを抑えられる。</li>



<li><strong>共通機能のモジュール化</strong><br>例えば、ログイン処理やフォームバリデーションなど、複数ページで使う機能をモジュール化することで、DRY（Don&#8217;t Repeat Yourself）を徹底。</li>



<li><strong>チーム開発でのメリット</strong><br>複数人で開発する場合も、モジュールごとに担当を分けることでコンフリクトを減らせる。</li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p>CodeIgniter3にHMVCパターンを導入することで、コードの可読性や保守性が劇的に向上しました。特に、既存のModelを活かしつつ導入できたことで、スムーズに移行できたのが大きなポイントです。</p>



<p>「CodeIgniterのMVCが限界かも…」と感じている方は、ぜひHMVCの導入を検討してみてください。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/the-introduction-of-hmvc-greatly-improves-development-efficiency/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CodeIgniter3でも.envが使える！煩雑な環境設定をスッキリ管理する方法</title>
		<link>https://blog.takeho.com/you-can-use-env-even-in-codeigniter3-a-clean-way-to-manage-complicated-environment-settings/</link>
					<comments>https://blog.takeho.com/you-can-use-env-even-in-codeigniter3-a-clean-way-to-manage-complicated-environment-settings/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 02 Feb 2025 09:25:25 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[環境変数]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=625</guid>

					<description><![CDATA[Webアプリケーションを開発・運用する際、&#8221;環境ごとの設定管理&#8221;は避けて通れない課題です。特にCodeIgniter3を使っていると、configやdatabase.phpを環境ごとに書き換えたり [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Webアプリケーションを開発・運用する際、&#8221;環境ごとの設定管理&#8221;は避けて通れない課題です。特にCodeIgniter3を使っていると、<code>config</code>や<code>database.php</code>を環境ごとに書き換えたり、ファイルを分けて管理したりと、正直面倒くさいですよね。</p>



<p>実際、私が.env導入に踏み切ったのは、ローカル・ステージング・本番と複数環境を使い分けるプロジェクトで、ちょっとした設定ミスで本番DBに接続してしまい、ヒヤッとしたことがきっかけでした。</p>



<p>「これはマズイ、何とかしないと…」</p>



<p>Laravelではおなじみの<code>.env</code>。CI3でも使えたら便利だなと思い、試行錯誤の末、無事導入しました。その方法を、同じ悩みを抱える皆さんと共有したいと思います。</p>



<h2 class="wp-block-heading">.envファイルとは？</h2>



<p><strong>.env</strong>ファイルは、アプリケーションの設定値を&#8221;環境変数&#8221;として定義・管理するためのファイルです。データベース接続情報やAPIキー、アプリの動作モードなどを、この1つのファイルで切り替え可能にします。</p>



<p>CI3では標準サポートされていませんが、PHPの<strong>vlucas/phpdotenv</strong>ライブラリを活用すれば、簡単に導入できます。</p>



<h2 class="wp-block-heading">導入で何が変わるのか？</h2>



<ul class="wp-block-list">
<li><strong>設定ミスが減る</strong><br>本番・開発で設定を間違えて大惨事…を防げる！</li>



<li><strong>セキュリティ向上</strong><br>APIキーやDBパスワードをコードに直書きしない。</li>



<li><strong>メンテナンス楽々</strong><br>環境追加や設定変更が超簡単。</li>
</ul>



<h2 class="wp-block-heading">導入手順</h2>



<h3 class="wp-block-heading"><strong>.envファイルを作成</strong></h3>



<p>プロジェクトのルートに<code>.env</code>を作ります</p>



<pre class="wp-block-code"><code>CI_ENV=development
DB_HOST=localhost
DB_USER=root
DB_PASS=secret
DB_NAME=ci_project</code></pre>



<h3 class="wp-block-heading"><strong>.gitignoreに追加</strong></h3>



<pre class="wp-block-code"><code>.env</code></pre>



<h3 class="wp-block-heading"><strong>phpdotenvをインストール</strong></h3>



<pre class="wp-block-code"><code>composer require vlucas/phpdotenv</code></pre>



<h3 class="wp-block-heading"><strong>index.phpを編集</strong></h3>



<pre class="wp-block-code"><code>require __DIR__ . '/../vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();</code></pre>



<h3 class="wp-block-heading"><strong>設定ファイルでgetenv()を使う</strong></h3>



<p><code><strong>application/config/database.php</strong></code>などで</p>



<pre class="wp-block-code"><code>'hostname' => getenv('DB_HOST'),
'username' => getenv('DB_USER'),
'password' => getenv('DB_PASS'),
'database' => getenv('DB_NAME'),</code></pre>



<h2 class="wp-block-heading">導入後の変化と感想</h2>



<p>.envを導入してから、環境切り替え時のストレスが一気に減りました。何より、「本番に接続してしまった…！」という冷や汗から解放されたのは大きいです。CI3を使い続けるなら、ぜひ導入をおすすめします！</p>





<a rel="noopener" href="https://github.com/vlucas/phpdotenv" title="GitHub - vlucas/phpdotenv: Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://opengraph.githubassets.com/b5ef646ae9efea366b35d9746a808a88ae7bd70f61182d2bf7ea833c53a983cb/vlucas/phpdotenv" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - vlucas/phpdotenv: Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.</div><div class="blogcard-snippet external-blogcard-snippet">Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically. - vlucas/phpdotenv</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/vlucas/phpdotenv" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/you-can-use-env-even-in-codeigniter3-a-clean-way-to-manage-complicated-environment-settings/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HybridAuthを使ってソーシャルログインを実装する</title>
		<link>https://blog.takeho.com/egoeo74ndhzhus7kni2ovfehcu5socn9/</link>
					<comments>https://blog.takeho.com/egoeo74ndhzhus7kni2ovfehcu5socn9/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sat, 26 Oct 2024 16:09:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[プラグイン]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=499</guid>

					<description><![CDATA[「HybridIgniter」は、CodeIgniterにOAuth認証やソーシャルログイン機能を追加するためのライブラリです。特に、FacebookやGoogle、TwitterなどのSNSを使用してユーザー認証を行う [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「HybridIgniter」は、CodeIgniterにOAuth認証やソーシャルログイン機能を追加するためのライブラリです。特に、FacebookやGoogle、TwitterなどのSNSを使用してユーザー認証を行う場合に便利です。以下は、HybridIgniterをCodeIgniterに組み込む手順と基本的な使い方です。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6"><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">インストールと設定</a><ol><li><a href="#toc2" tabindex="0">ダウンロードとインストール</a></li><li><a href="#toc3" tabindex="0">HybridAuthライブラリのダウンロード</a></li><li><a href="#toc4" tabindex="0">設定ファイルの作成</a></li><li><a href="#toc5" tabindex="0">コントローラーの作成</a></li><li><a href="#toc6" tabindex="0">ルーティングの設定</a></li></ol></li><li><a href="#toc7" tabindex="0">利用方法</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">インストールと設定</span></h2>



<h3 class="wp-block-heading"><span id="toc2">ダウンロードとインストール</span></h3>



<p>「HybridIgniter」ライブラリをダウンロードし、CodeIgniterの<code>application/libraries/</code>ディレクトリに配置します。</p>



<h3 class="wp-block-heading"><span id="toc3">HybridAuthライブラリのダウンロード</span></h3>



<p>HybridAuthの公式リポジトリから<a rel="noopener" href="https://github.com/hybridauth/hybridauth" target="_blank">HybridAuth</a>をダウンロードし、<code>application/third_party/HybridAuth/</code>に設置します。</p>



<h3 class="wp-block-heading"><span id="toc4">設定ファイルの作成</span></h3>



<p><code><strong>application/config/</strong></code>に<code><strong>hybridauthlib.php</strong></code>という設定ファイルを作成し、以下のように設定します。</p>



<pre class="wp-block-code"><code>$config&#91;'hybridauth'] = &#91;
    "base_url" => base_url("hauth/endpoint"),
    "providers" => &#91;
        "Google" => &#91;
            "enabled" => true,
            "keys" => &#91;"id" => "YOUR_GOOGLE_CLIENT_ID", "secret" => "YOUR_GOOGLE_CLIENT_SECRET"],
        ],
        "Facebook" => &#91;
            "enabled" => true,
            "keys" => &#91;"id" => "YOUR_FACEBOOK_APP_ID", "secret" => "YOUR_FACEBOOK_APP_SECRET"],
        ],
        "Twitter" => &#91;
            "enabled" => true,
            "keys" => &#91;"key" => "YOUR_TWITTER_CONSUMER_KEY", "secret" => "YOUR_TWITTER_CONSUMER_SECRET"],
        ],
    ],
];
</code></pre>



<p>各プロバイダー（Google、Facebook、Twitterなど）のクライアントIDやシークレットを入力します。</p>



<h3 class="wp-block-heading"><span id="toc5">コントローラーの作成</span></h3>



<p><code><strong>application/controllers/Hauth.php</strong></code>というコントローラーを作成し、以下のように認証の処理を実装します。</p>



<pre class="wp-block-code"><code>&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Hauth extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->library('hybridauthlib');
    }

    public function login($provider) {
        try {
            $service = $this->hybridauthlib->authenticate($provider);
            if ($service->isUserConnected()) {
                $userProfile = $service->getUserProfile();
                // ユーザーデータの取得と保存処理
                print_r($userProfile);
            }
        } catch(Exception $e) {
            show_error($e->getMessage());
        }
    }

    public function endpoint() {
        $this->hybridauthlib->process();
    }
}
</code></pre>



<p><code>login</code>メソッドで認証プロバイダ（Google、Facebookなど）を指定し、ユーザー認証を行います。</p>



<h3 class="wp-block-heading"><span id="toc6">ルーティングの設定</span></h3>



<p><code><strong>application/config/routes.php</strong></code>に、HybridAuthのエンドポイントとログインパスを追加します。</p>



<pre class="wp-block-code"><code>$route&#91;'hauth/(:any)'] = 'hauth/$1';</code></pre>



<h2 class="wp-block-heading"><span id="toc7">利用方法</span></h2>



<p>認証プロバイダーのURLにアクセスすることで、ユーザー認証を開始できます。</p>



<pre class="wp-block-code"><code>https:&#47;&#47;example.com/hauth/login/Google</code></pre>



<p>認証後、ユーザーのプロフィール情報が<code>$userProfile</code>に格納されます。これを使って、ユーザーのデータを取得したり、ユーザー情報をデータベースに保存することができます。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box not-nested-style cocoon-block-label-box"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">注意点</span></div><div class="label-box-content block-box-content box-content">
<p>各プロバイダーのAPI設定で、リダイレクトURIをCodeIgniterのエンドポイント（例：<code>https://example.com/hauth/endpoint</code>）に設定する必要があります。</p>
</div></div>





<a rel="noopener" href="https://github.com/hybridauth/hybridauth" title="GitHub - hybridauth/hybridauth: Open source social sign on PHP Library. HybridAuth goal is to act as an abstract api between your application and various social apis and identities providers such as Facebook, Twitter and Google." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/b8254d163efdebf4cd80c9a922a38a6a0b7d345243a3db0a7d168706fa9bfaf7/hybridauth/hybridauth" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - hybridauth/hybridauth: Open source social sign on PHP Library. HybridAuth goal is to act as an abstract api between your application and various social apis and identities providers such as Facebook, Twitter and Google.</div><div class="blogcard-snippet external-blogcard-snippet">Open source social sign on PHP Library. HybridAuth goal is to act as an abstract api between your application and variou...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/hybridauth/hybridauth" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/egoeo74ndhzhus7kni2ovfehcu5socn9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>複数のモデルを共通して簡単に利用するための技：CodeIgniter 3のコアクラス拡張</title>
		<link>https://blog.takeho.com/5ux0tlca9wc51pvn7jtuns1wu3ovipr0/</link>
					<comments>https://blog.takeho.com/5ux0tlca9wc51pvn7jtuns1wu3ovipr0/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Thu, 19 Sep 2024 16:05:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Model]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=380</guid>

					<description><![CDATA[CodeIgniter 3を使用する際、モデルはデータベースとのやり取りを担う重要な役割を果たします。しかし、複数のモデル間で共通する処理を繰り返し記述すると、コードが冗長になり、保守性が低下してしまいます。そこで今回は [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CodeIgniter 3を使用する際、モデルはデータベースとのやり取りを担う重要な役割を果たします。しかし、複数のモデル間で共通する処理を繰り返し記述すると、コードが冗長になり、保守性が低下してしまいます。そこで今回は、コアクラスを拡張して、複数のモデルで共通の機能を簡単に利用できる方法をご紹介します。このテクニックを使うことで、開発の効率が大幅に向上します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8"><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">MY_Modelという共通ベースモデルを作成する</a><ol><li><a href="#toc2" tabindex="0">ステップ</a><ol><li><a href="#toc3" tabindex="0">コアクラスにベースモデルを作成</a></li><li><a href="#toc4" tabindex="0">モデルでベースモデルを継承</a></li></ol></li></ol></li><li><a href="#toc5" tabindex="0">モデル内での共通処理を簡素化する</a></li><li><a href="#toc6" tabindex="0">共通のバリデーションルールをベースモデルに追加</a><ol><li><a href="#toc7" tabindex="0">ベースモデルにバリデーションルールを追加</a></li><li><a href="#toc8" tabindex="0">モデルごとのバリデーションルール設定例</a></li></ol></li><li><a href="#toc9" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">MY_Modelという共通ベースモデルを作成する</span></h2>



<p>CodeIgniterでは、<code>MY_</code> プレフィックスをつけたファイルを作成することで、フレームワークのコアクラスを拡張できます。これを利用して、全てのモデルに共通する機能をまとめた<strong>ベースモデル</strong>を作成しましょう。</p>



<h3 class="wp-block-heading"><span id="toc2">ステップ</span></h3>



<h4 class="wp-block-heading"><span id="toc3">コアクラスにベースモデルを作成</span></h4>



<p><code><strong>application/core/MY_Model.php</strong></code> というファイルを作成し、共通のロジックを記述します。</p>



<pre class="wp-block-code"><code>&lt;?php
class MY_Model extends CI_Model {

    public function __construct() {
        parent::__construct();
    }

    public function find($id, $table) {
        return $this->db->where('id', $id)->get($table)->row();
    }

    public function get_all($table) {
        return $this->db->get($table)->result();
    }

    public function insert($table, $data) {
        return $this->db->insert($table, $data);
    }

    public function update($id, $table, $data) {
        return $this->db->where('id', $id)->update($table, $data);
    }

    public function delete($id, $table) {
        return $this->db->where('id', $id)->delete($table);
    }
}
</code></pre>



<h4 class="wp-block-heading"><span id="toc4">モデルでベースモデルを継承</span></h4>



<p>例えば、<code>User_model</code> や <code>Product_model</code> などのモデルでこの共通ベースモデルを継承します。</p>



<pre class="wp-block-code"><code>class User_model extends MY_Model {

    protected $table = 'users';

    public function __construct() {
        parent::__construct();
    }

    public function get_active_users() {
        return $this->db->where('status', 'active')->get($this->table)->result();
    }
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc5">モデル内での共通処理を簡素化する</span></h2>



<p>ベースモデルを作成することで、データベース操作に関する共通処理を各モデルで簡単に行えるようになります。特に、テーブル名を各モデルで設定し、ベースモデルのメソッドで利用することで、コードが大幅に短縮されます。</p>



<pre class="wp-block-code"><code>class MY_Model extends CI_Model {

    protected $table;

    public function find($id) {
        return $this->db->where('id', $id)->get($this->table)->row();
    }

    public function get_all() {
        return $this->db->get($this->table)->result();
    }

    public function insert($data) {
        return $this->db->insert($this->table, $data);
    }

    public function update($id, $data) {
        return $this->db->where('id', $id)->update($this->table, $data);
    }

    public function delete($id) {
        return $this->db->where('id', $id)->delete($this->table);
    }
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc6">共通のバリデーションルールをベースモデルに追加</span></h2>



<p>各モデルでよく使うバリデーションを共通化するために、ベースモデルにバリデーションルールを追加します。これにより、モデルごとのコードの重複を避け、管理しやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc7">ベースモデルにバリデーションルールを追加</span></h3>



<pre class="wp-block-code"><code>class MY_Model extends CI_Model {

    protected $table;
    protected $validation_rules = array();

    public function __construct() {
        parent::__construct();
        $this->load->library('form_validation');
    }

    public function validate($data) {
        $this->form_validation->set_data($data);
        $this->form_validation->set_rules($this->validation_rules);

        if ($this->form_validation->run() == FALSE) {
            return $this->form_validation->error_array();
        } else {
            return TRUE;
        }
    }
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc8">モデルごとのバリデーションルール設定例</span></h3>



<pre class="wp-block-code"><code>class User_model extends MY_Model {

    protected $table = 'users';

    public function __construct() {
        parent::__construct();
        $this->validation_rules = array(
            array(
                'field' => 'name',
                'label' => 'Name',
                'rules' => 'required'
            ),
            array(
                'field' => 'email',
                'label' => 'Email',
                'rules' => 'required|valid_email'
            )
        );
    }
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc9">まとめ</span></h2>



<p>これらのテクニックを使うことで、CodeIgniter 3でのモデル管理が簡単かつ効率的になります。共通処理をベースモデルにまとめることで、コードの重複を減らし、保守性を向上させることができます。ぜひ、これらの技を活用して、より良い開発環境を整えてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/5ux0tlca9wc51pvn7jtuns1wu3ovipr0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CodeIgniter3の環境を整える</title>
		<link>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/</link>
					<comments>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 01 Sep 2024 04:11:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[インストール]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=304</guid>

					<description><![CDATA[CodeIgniter3は、4に比べcomposerやミドルウェア、名前空間に対応しておりませんが軽量で扱いやすく少ないリソースで高速に動作するフレームワークとして現在も人気があります。 ここではLinux環境へCode [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CodeIgniter3は、4に比べcomposerやミドルウェア、名前空間に対応しておりませんが軽量で扱いやすく少ないリソースで高速に動作するフレームワークとして現在も人気があります。</p>



<p>ここではLinux環境へCodeIgniter3のフレームワークをセットアップする方法について説明します。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box not-nested-style cocoon-block-caption-box"><div class="caption-box-label block-box-label box-label"><span class="caption-box-label-text block-box-label-text box-label-text">補足</span></div><div class="caption-box-content block-box-content box-content">
<p>既にウェブサーバ・MｙSQLサーバのインストールやドキュメントルートが設定済である事を前提とします。</p>
</div></div>



<p>またドキュメントルートは</p>



<pre class="wp-block-code"><code>/var/www/html/codeigniter3/public</code></pre>



<p>とし、ホスト名はwww.example.comとします。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10"><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">フレームワークの取得・設置</a></li><li><a href="#toc2" tabindex="0">ファイル構造の変更</a><ol><li><a href="#toc3" tabindex="0">ディレクトリの作成・ファイルの移動</a></li><li><a href="#toc4" tabindex="0">ディレクトリ設定の変更</a></li></ol></li><li><a href="#toc5" tabindex="0">設定ファイルの変更</a></li><li><a href="#toc6" tabindex="0">データベースの設定</a></li><li><a href="#toc7" tabindex="0">綺麗なURLにする</a></li><li><a href="#toc8" tabindex="0">ライブラリ・ヘルパーの自動読み込み</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">フレームワークの取得・設置</span></h2>



<p>サーバへターミナル等でログイン後、次のコマンドでディレクトリ移動します。</p>



<pre class="wp-block-code"><code># cd /var/www/html/</code></pre>



<p>　次のダウンロードサイトからCodeIgniter v3.2.0-dev (Current version)のリンクURLを取得します。</p>





<a rel="noopener" href="https://codeigniter.jp/user_guide/3/installation/downloads.html" title="CodeIgniter &#12398;&#12480;&#12454;&#12531;&#12525;&#12540;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fcodeigniter.jp%2Fuser_guide%2F3%2Finstallation%2Fdownloads.html?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">CodeIgniter &#12398;&#12480;&#12454;&#12531;&#12525;&#12540;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://codeigniter.jp/user_guide/3/installation/downloads.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">codeigniter.jp</div></div></div></div></a>




<p>次のようにURLを指定してコマンドを実行します。</p>



<pre class="wp-block-code"><code># wget https://codeload.github.com/bcit-ci/CodeIgniter/zip/develop</code></pre>



<p>コマンド実行後developというファイルが取得されますが、このファイル名では何のファイルが不明なので次のように名前変更します。</p>



<pre class="wp-block-code"><code># mv develop develop.zip</code></pre>



<p>次にこのファイルを解凍します。</p>



<pre class="wp-block-code"><code># unzip develop.zip</code></pre>



<p>解凍後、<strong>CodeIgniter-develop</strong>のファイルの存在が確認できますが更に次のコマンドで名前変更します。</p>



<pre class="wp-block-code"><code># mv CodeIgniter-develop codeigniter3</code></pre>



<h2 class="wp-block-heading"><span id="toc2">ファイル構造の変更</span></h2>



<p>Codeigniter3内のファイル構造は次の通りです。</p>



<pre class="wp-block-preformatted">/var/www/html<br>└ codeigniter3<br>　├application(ディレクトリ)<br>　├build-release.sh<br>　├composer.json<br>　├contributing.md<br>　├DCO.txt<br>　├.editorconfig<br>　├.github(ディレクトリ)<br>　├.gitignore<br>　├index.php<br>　├license.txt<br>　├readme.rst<br>　├system(ディレクトリ)<br>　└tests(ディレクトリ)</pre>



<p>上記構造のうちドキュメントルートに設置する予定のindex.phpを起点とするとsystemディレクトリとapplicationディレクトリは公開する必要のないディレクトリになりキー情報やこの後設定するデータベースの接続情報など、外部に漏れてはいけない状況がドキュメントルート配下に配置環境の為、セキュアではありません。</p>



<p>尚、systemディレクトリやapplicationディレクトリ内のファイルは全て</p>



<pre class="wp-block-code"><code>&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');</code></pre>



<p>のように定数によるアクセス制限を掛けている為、直接アクセスする事はできない意味では安全ですが、これはPHPが正常に動作した場合に限り安全というには根本的な対策にはなっていません。</p>



<p>この対策としてsystemディレクトリとapplicationディレクトリをドキュメントルート配下でなない上位ディレクトリへ設置するように変更します。</p>



<h3 class="wp-block-heading"><span id="toc3">ディレクトリの作成・ファイルの移動</span></h3>



<pre class="wp-block-code"><code># mkdir public</code></pre>



<p><strong>public</strong>ディレクトリを作成します。</p>



<pre class="wp-block-code"><code>mv index.php ./public/</code></pre>



<p><strong>index.php</strong>を<strong>public</strong>ディレクトリ内へ移動します。</p>



<h3 class="wp-block-heading"><span id="toc4">ディレクトリ設定の変更</span></h3>



<p><strong>index.php</strong>を次のように変更します。</p>



<pre class="wp-block-code"><code>        // 93行目付近
	$system_path = '../system'; 

        // 110行目付近
	$application_folder = '../application';</code></pre>



<p>上記の更新にてドキュメントルート配下からその上位ディレクトリへの変更が完了となります。</p>



<h2 class="wp-block-heading"><span id="toc5">設定ファイルの変更</span></h2>



<p>ホスト名の指定など次のファイルを編集します。</p>



<pre class="wp-block-code"><code>application/config/config.php</code></pre>



<p>設定内容は次のようにキー名と値の構成になります。</p>



<pre class="wp-block-code"><code>$config&#91;キー名] = '値’</code></pre>



<p>次の表は初期設定の際に必要となる主要な設定情報の一覧になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>キー名</td><td>内容</td><td>設定値・例</td><td>説明</td></tr><tr><td>base_url</td><td>ベースURL</td><td>http://www.example.com/</td><td>インデックス名を省いたアクセスURLを記載します。</td></tr><tr><td>index_page</td><td>インデックス名</td><td>index.php<br>※表記させない場合は値は指定しない</td><td>インデックスページへのアクセス名（ベースURLは除く）</td></tr><tr><td>url_suffix</td><td>サフィックス</td><td>.html</td><td>URLの最後に付加する固定文字列</td></tr><tr><td>language</td><td>言語</td><td>japanese</td><td>言語名を指定</td></tr><tr><td>charset</td><td>文字コード</td><td>utf-8</td><td>出力するリソースの文字コード</td></tr><tr><td>composer_autoload</td><td>リソースのオートロード</td><td>TRUE / FALSE</td><td>composerパッケージの自動用読み込み</td></tr><tr><td>log_threshold</td><td>ログ出力設定</td><td>1～４</td><td>0：ロギングを無効にする、エラーロギングをオフにする<br>1：エラーメッセージ(PHPエラーを含む)<br>2：デバッグメッセージ<br>3：情報メッセージ<br>4：すべてのメッセージ</td></tr><tr><td>encryption_key</td><td>暗号キー</td><td>一意なる複雑な文字列</td><td>セッションやセキュリティクラスで使用する暗号・複合で使用するキー</td></tr><tr><td>sess_driver</td><td>セッションドライバ</td><td>files / database / redis / memcached</td><td>セッションの保存方法</td></tr><tr><td>csrf_protection</td><td>CSRF 保護</td><td>TRUE / FALSE</td><td>CSRFの脆弱性対策機能の有効・無効</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc6">データベースの設定</span></h2>



<p>以下のファイルを編集しデータベース<strong>MySQL</strong>の接続情報を設定します。</p>



<pre class="wp-block-code"><code>application/config/database.php</code></pre>



<pre class="wp-block-code"><code>$db&#91;'default'] = array(
	'dsn'	=> '',
	'hostname' => 'ホスト名',
	'username' => 'DBユーザー名',
	'password' => 'パスワード',
	'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
);</code></pre>



<h2 class="wp-block-heading"><span id="toc7">綺麗なURLにする</span></h2>



<p>例えば複数の会員情報の一覧から特定の会員IDが5番のプロフィール詳細ページは一般的に次のようになります。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;www.example.com/index.php/profile/view/id/5</code></pre>



<p>上記URLでは<strong>index.php</strong>のインデックスファイルの後にパラメータがスラッシュ区切りで構成される為、綺麗ではないので<strong>index.php</strong>を削除して綺麗にURLにする為、次のファイルを作成・編集します。</p>



<pre class="wp-block-code"><code>public/.htaccess</code></pre>



<pre class="wp-block-code"><code>RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 &#91;L]</code></pre>



<h2 class="wp-block-heading"><span id="toc8">ライブラリ・ヘルパーの自動読み込み</span></h2>



<p>常に使用するライブラリや頻繁に使用するヘルパーなどは自動読み込み設定する事でコントローラー内で都度読み込み宣言を記載する手間を省く事ができます。</p>



<p>次のファイルを編集します。</p>



<pre class="wp-block-code"><code>application/config/autoload.php</code></pre>



<pre class="wp-block-code"><code>// ライブラリ自動読み込み
$autoload&#91;'libraries'] = &#91;
  'database',
  'session',
];

// ヘルパー自動読み込み
$autoload&#91;'helper'] = &#91;
  'url',
  'form',
];</code></pre>



<p>これで環境の用意はひとまず完了です。</p>



<p>これ以外に必要な情報は別途ドキュメントを参照して編集してください。</p>





<a rel="noopener" href="https://codeigniter.jp/user_guide/3" title="CodeIgniter &#12518;&#12540;&#12470;&#12460;&#12452;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fcodeigniter.jp%2Fuser_guide%2F3?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">CodeIgniter &#12518;&#12540;&#12470;&#12460;&#12452;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://codeigniter.jp/user_guide/3" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">codeigniter.jp</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CodeIgniterのModelの概要について</title>
		<link>https://blog.takeho.com/zpd6llieq6sm6i1710w68soctz535bi9/</link>
					<comments>https://blog.takeho.com/zpd6llieq6sm6i1710w68soctz535bi9/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Thu, 29 Aug 2024 17:40:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Model]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=294</guid>

					<description><![CDATA[CI3からCI4へのバージョンアップは飛躍的に全体の仕様が変更となりモデルも今までの仕様と全く異なる内容になっているので、最低限必要な情報について説明します。 設定 プロパティについて、次に説明します。 $table 利 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CI3からCI4へのバージョンアップは飛躍的に全体の仕様が変更となりモデルも今までの仕様と全く異なる内容になっているので、最低限必要な情報について説明します。</p>



<h3 class="wp-block-heading"><span id="toc1">設定</span></h3>



<p>プロパティについて、次に説明します。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table = 'users';
    protected $primaryKey = 'user_id';
    protected $useAutoIncrement = false;
    protected $returnType= 'array';
    //protected $returnType = User::class;
    protected $useSoftDeletes = true;
    protected $allowedFields = &#91;
        'username',
        'email',
        'password',
    ];
    protected bool $allowEmptyInserts = false;

    // date property
    protected $useTimestamps = true;
    protected $dateFormat = 'datetime';
    protected $createdField = 'created_at';
    protected $updatedField = 'updated_at';
    protected $deletedField = 'deleted_at';
}
</code></pre>



<h4 class="wp-block-heading"><span id="toc2">$table</span></h4>



<p>利用するテーブル物理名を設定するプロパティです。<br>必ず設定する必要があります。</p>



<h4 class="wp-block-heading"><span id="toc3">$primaryKey</span></h4>



<p>テーブルのプライマリーキーを設定するプロパティです。<br>デフォルトは<code>id</code>なので、ほとんどのテーブルでは設定しなくても問題ありませんが、<br>id以外のカラムをPKにする場合は、必ず設定する必要があります。</p>



<h4 class="wp-block-heading"><span id="toc4">$useAutoIncrement</span></h4>



<p>オートインクリメント機能を利用するか設定するプロパティです。<br>デフォルトは<code>true</code>なので、ほとんどのテーブルでは設定しなくても問題ありませんが、<br>オートインクリメントではないカラムをPKにする場合は、<code>false</code>に設定する必要があります。</p>



<h4 class="wp-block-heading"><span id="toc5">$returnType</span></h4>



<p>CRUD実行時に返却される結果の形式を設定するプロパティです。<br>デフォルトは<code>array</code>なので配列形式で返されますが、Entity形式も指定できます。</p>



<h4 class="wp-block-heading"><span id="toc6">$useSoftDeletes</span></h4>



<p>delete()でのレコード削除を論理削除にするか設定するプロパティです。<br>デフォルトは<code>false</code>なので、物理削除テーブルとして扱われます。<br><code>true</code>に設定すると論理削除になるだけでなく、find()による取得時も論理削除されたデータは取得されないような条件でSQLが構築されます。</p>



<h4 class="wp-block-heading"><span id="toc7">$allowedFields</span></h4>



<p>登録/更新を許可するカラムを設定するプロパティです。<br>指定されていないカラムは値をセットしていても無視されるので、意図しないカラムの更新を防ぐことが出来ます。<br>なお、取得には影響しません。</p>



<h4 class="wp-block-heading"><span id="toc8">$allowEmptyInserts</span></h4>



<p>空データのinsertを許容するか設定するプロパティです。<br>デフォルトは<code>false</code>なので、許容されません。<br>何かしらの理由で。空データをまず登録した後で必要な値に更新したいケースがあれば、利用することがありそうですが、基本的には利用しないと思います。</p>



<h4 class="wp-block-heading"><span id="toc9">$useTimestamps</span></h4>



<p>登録や更新に、現在日付を自動的に登録するか設定するプロパティです。<br>デフォルトは<code>false</code>です。<br><code>true</code>にした場合は、<code>$dateFormat</code>で指定した形式で自動的に登録します。</p>



<h4 class="wp-block-heading"><span id="toc10">$dateFormat</span></h4>



<p>自動登録する日付の型を設定するプロパティです。<br>デフォルトは<code>datetime</code>ですが、他にも<code>date</code>か<code>int</code>が設定できます。</p>



<h4 class="wp-block-heading"><span id="toc11">$createdField</span></h4>



<p>登録日時に現在日時を登録するカラムを設定するプロパティです。<br>デフォルトは、<code>created_at</code>です。</p>



<h4 class="wp-block-heading"><span id="toc12">$updatedField</span></h4>



<p>更新日時に現在日時を登録するカラムを設定するプロパティです。<br>デフォルトは、<code>updated_at</code>です。</p>



<h4 class="wp-block-heading"><span id="toc13">$deletedField</span></h4>



<p>削除日時に現在日時を登録するカラムを設定するプロパティです。<br>デフォルトは、<code>deleted_at</code>です。</p>



<h3 class="wp-block-heading"><span id="toc14">バリデーション</span></h3>



<p>次に、モデルを利用した登録/更新時にバリデーションを行う際の各種設定です。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $validationRules = &#91;
        'username'     => 'required|max_length&#91;30]|alpha_numeric_space|min_length&#91;3]',
        'email'        => 'required|max_length&#91;254]|valid_email|is_unique&#91;users.email]',
        'password'     => 'required|max_length&#91;255]|min_length&#91;8]',
        'pass_confirm' => 'required_with&#91;password]|max_length&#91;255]|matches&#91;password]',
    ];
    protected $validationMessages = &#91;
        'email' => &#91;
            'is_unique' => '既に登録されているメールアドレスです。',
        ],
    ];
    protected $skipValidation = false;
    protected $cleanValidationRules = true;
}</code></pre>



<h4 class="wp-block-heading"><span id="toc15">$validationRules</span></h4>



<p>バリデーションルールを配列形式で設定するプロパティです。<br>デフォルトは、<code>[]</code>です。</p>



<h4 class="wp-block-heading"><span id="toc16">$validationMessages</span></h4>



<p>バリデーションエラー時のメッセージを配列形式で設定するプロパティです。<br>デフォルトは、<code>[]</code>です。</p>



<h4 class="wp-block-heading"><span id="toc17">$skipValidation</span></h4>



<p>登録/更新時にバリデーションを行うか設定するプロパティです。<br>デフォルトは、<code>false</code>なのでバリデーションは行います。<br>ただ、前述の<code>$validationRules</code>を指定しないと行われません。</p>



<h4 class="wp-block-heading"><span id="toc18">$cleanValidationRules</span></h4>



<p>渡されたデータに存在しないバリデーションルールは、バリデーション対象から除外するか設定するプロパティです。<br>デフォルトは<code>true</code>なので除外されます。<br>更新時に一部カラムだけ更新したい場合に、trueにしておけばバリデーションエラーを回避できます。</p>



<h3 class="wp-block-heading"><span id="toc19">コールバック</span></h3>



<p>各CRUD実行時に使用可能なコールバックです。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $allowCallbacks = true;
    protected $beforeInsert = &#91;];
    protected $afterInsert = &#91;];
    protected $beforeUpdate = &#91;];
    protected $afterUpdate = &#91;];
    protected $beforeFind = &#91;];
    protected $afterFind = &#91;];
    protected $beforeDelete = &#91;];
    protected $afterDelete = &#91;];
}
</code></pre>



<h4 class="wp-block-heading"><span id="toc20">$allowCallbacks</span></h4>



<p>コールバック処理を許可するか設定するプロパティです。<br>デフォルトは<code>true</code>なので、コールバック処理が実装されていれば実行されます。</p>



<h4 class="wp-block-heading"><span id="toc21">$beforeInsert、$beforeUpdate、$beforeFind、$beforeDelete</span></h4>



<p>それぞれ、<code>登録/更新/取得/削除前</code>に行う処理を記載するメソッドです。<br>メソッドに渡される引数はそれぞれ異なります。</p>



<h4 class="wp-block-heading"><span id="toc22">$afterInsert、$afterUpdate、$afterFind、$afterDelete</span></h4>



<p>それぞれ、<code>登録/更新/取得/削除後</code>に行う処理を記載するメソッドです。<br>beforeと同様、メソッドに渡される引数はそれぞれ異なります。</p>



<h3 class="wp-block-heading"><span id="toc23">CRUDメソッド</span></h3>



<h4 class="wp-block-heading"><span id="toc24">find($pk)</span></h4>



<p>PKを条件にデータを取得するメソッドです。<br>論理削除されたデータは取得されません。</p>



<pre class="wp-block-code"><code>$user = $userModel->find(1); // PKで単一取得
$user = $userModel->find(&#91;1, 2]); // PKで複数取得
// SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` IN (1,2)</code></pre>



<h4 class="wp-block-heading"><span id="toc25">findColumn($columeName)</span></h4>



<p>単一カラムの取得を行うメソッドです。<br>論理削除されたデータは取得されません。</p>



<pre class="wp-block-code"><code>$user = $userModel->findColumn('login_id');
// SELECT `login_id` FROM `users` WHERE `users`.`deleted_at` IS NULL</code></pre>



<h4 class="wp-block-heading"><span id="toc26">findAll($limit, $offset)</span></h4>



<p>データを全件取得するメソッドです。<br>条件を絞りたい場合はクエリビルダーのwhereなどを利用します。<br>論理削除されているデータは取得されません。</p>



<pre class="wp-block-code"><code>$user = $userModel->where('user_code', 'test')->findAll();
// SELECT * FROM `users` WHERE `user_code` = 'test' AND `users`.`deleted_at` IS NULL</code></pre>



<h4 class="wp-block-heading"><span id="toc27">first()</span></h4>



<p>単一のデータを取得するメソッドです。<br>条件を絞りたい場合はクエリビルダーのwhereなどを利用します。<br>論理削除されているデータは取得されません。</p>



<pre class="wp-block-code"><code>$user = $userModel->where('user_code', 'test')->first();
// SELECT * FROM `users` WHERE `user_code` = 'test' AND `users`.`deleted_at` IS NULL  LIMIT 1</code></pre>



<h4 class="wp-block-heading"><span id="toc28">withDeleted()</span></h4>



<p>論理削除されたデータも取得したい時に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$user = $userModel->where('user_code', 'test')->withDeleted()->findAll();
// SELECT * FROM `users` WHERE `user_code` = 'test'</code></pre>



<h4 class="wp-block-heading"><span id="toc29">onlyDeleted()</span></h4>



<p>論理削除されたデータのみ取得したい時に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$user = $userModel->onlyDeleted()->where('user_code', 'test')->findAll();
// SELECT * FROM `users` WHERE `user_code` = 'test' AND `users`.`deleted_at` IS NOT NULL</code></pre>



<h4 class="wp-block-heading"><span id="toc30">insert($data)</span></h4>



<p>新規登録したい場合に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$data = &#91;
  'login_id' => 'user1',
  'password' => 'password',
];
$userModel->insert($data); // return PK
$userModel->insert($data, false); // returnクエリ成否。成功(true)、失敗(false)
$userModel->getInsertID(); // return 登録したPKの値
// INSERT INTO `users` (`login_id`, `password`, `created_at`, `updated_at`) VALUES ('user1', 'password', '2024-04-23 09:20:33', '2024-04-23 09:20:33')</code></pre>



<h4 class="wp-block-heading"><span id="toc31">allowEmptyInserts()</span></h4>



<p>空のデータを新規登録したい場合に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$userModel->allowEmptyInserts()
// created_at, updated_atの自動登録をモデルで設定している場合
// INSERT INTO `users` (`created_at`, `updated_at`) VALUES ('2024-04-23 09:33:57', '2024-04-23 09:33:57')
// created_at, updated_atの自動登録をモデルで設定していない場合
// INSERT INTO `users` VALUES ()</code></pre>



<h4 class="wp-block-heading"><span id="toc32">update($pk, $data)</span></h4>



<p>データを更新したい場合に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$data = &#91;
   'login_id' => 'user1',
   'password' => 'password',
];
$userModel->update(1, $data); // return クエリ成否。返り値は成功(true)、失敗(false)。
// UPDATE `users` SET `login_id` = 'user1', `password` = 'password' WHERE `users`.`id` IN (1)

$userModel->update(&#91;10, 11, 12], $data); // 更新処理を実施
// UPDATE `users` SET `login_id` = 'user1', `password` = 'password' WHERE `users`.`id` IN (10,11,12)

$userModel->where('name', '山田')->set($data)->update(); // 主キー以外のupdateをしたい場合
// UPDATE `users` SET `login_id` = 'user1', `password` = 'password' WHERE `name` = '山田'

$userModel->set($data)->update(); // 更新処理を実施
// 4.3からwhereを指定しないとエラーになります
// Updates are not allowed unless they contain a "where" or "like" clause</code></pre>



<h4 class="wp-block-heading"><span id="toc33">save()</span></h4>



<p>insert()/update()のラッパーで、PKが指定されていれば更新、されていなければ新規登録するメソッドです。</p>



<pre class="wp-block-code"><code>$data = &#91;
   'login_id' => 'user1',
   'password' => 'password',
];
$userModel->save($data); // 新規登録。return クエリ成否。返り値は成功(true)、失敗(false)
// INSERT INTO `users` (`login_id`, `password`) VALUES ('user1', 'password')

$data = &#91;
   'id' => 10,
   'login_id' => 'user1',
   'password' => 'password',
];
$userModel->save($data); // 更新
// UPDATE `users` SET `login_id` = 'user1', `password` = 'password' WHERE `users`.`id` IN (10)</code></pre>



<h4 class="wp-block-heading"><span id="toc34">delete()</span></h4>



<p>データを削除したい場合に利用するメソッドです。<br>$useSoftDeletesが設定されていれば論理削除、されていなければ物理削除になります。</p>



<pre class="wp-block-code"><code>$userModel->delete(1); // PKで単一削除。return クエリ成否。返り値は成功(true)、失敗(false)。
// UPDATE `users` SET `deleted_at` = '2024-04-23 10:11:36' WHERE `id` IN (1) AND `deleted_at` IS NULL

$userModel->delete(&#91;1, 2]); // PKで複数削除
// UPDATE `users` SET `deleted_at` = '2024-04-23 10:12:14' WHERE `id` IN (1,2) AND `deleted_at` IS NULL

$userModel->where('login_id', 'user1')->delete(); // PK以外の条件場合はクエリビルダーのwhere等を使う
// UPDATE `users` SET `deleted_at` = '2024-04-23 10:13:00' WHERE `login_id` = 'user1' AND `deleted_at` IS NULL</code></pre>



<h4 class="wp-block-heading"><span id="toc35">purgeDeleted()</span></h4>



<p>論理削除されたデータを全て物理削除するメソッドです。</p>



<pre class="wp-block-code"><code>$userModel->purgeDeleted();
// DELETE FROM `users` WHERE `users`.`deleted_at` IS NOT NULL</code></pre>



<h3 class="wp-block-heading"><span id="toc36">追加分</span></h3>



<h4 class="wp-block-heading"><span id="toc37">chunk()</span></h4>



<p>バッチなどで大量のデータを処理する場合にメモリが枯渇しないように、分割取得して処理したい場合に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$userModel->where('company_code', 1)->chunk(2, static function ($data) {
    // 何かしらの処理
});
// 取得するデータが5件ある場合
// SELECT COUNT(*) AS `numrows` FROM `users` WHERE `company_code` = 1
// SELECT * FROM `users` WHERE `company_code` = 1 LIMIT 2
// SELECT * FROM `users` WHERE `company_code` = 1 LIMIT 2, 2
// SELECT *　FROM `users`　WHERE `company_code` = 1　LIMIT 4, 2</code></pre>



<h4 class="wp-block-heading"><span id="toc38">protect()</span></h4>



<p>一時的に<code>$allowedFields</code>を無視して、登録/更新したい際に利用するメソッドです。<br>seedでのテストデータ登録などで利用しますが、通常は使わないようにしましょう。</p>



<pre class="wp-block-code"><code>$userModel->protect(false)->insert($data)->protect(true); // シード実施時など、一時的に</code></pre>



<h4 class="wp-block-heading"><span id="toc39">asArray()、asObject()</span></h4>



<p>$returnTypeに指定した形式以外で取得したい場合に利用するメソッドです。</p>



<pre class="wp-block-code"><code>$userModel->asArray()->where('status', 'active')->findAll();
$userModel->asObject()->where('status', 'active')->findAll();</code></pre>



<h4 class="wp-block-heading"><span id="toc40">クエリビルダーの呼び出し</span></h4>



<p>モデルからクエリビルダーのメソッドは呼び出すことが出来ます。<br>（ビルダーからモデルのメソッドは呼び出すことは出来ません）</p>



<pre class="wp-block-code"><code>$userModel->builder();
$userModel->builder('books'); // 別テーブルのビルダーを取得</code></pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/zpd6llieq6sm6i1710w68soctz535bi9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CI4でソーシャルメディアログインを実装する</title>
		<link>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/</link>
					<comments>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Fri, 26 Jul 2024 04:59:55 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Social]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=86</guid>

					<description><![CDATA[Codeigniter4でfacebookやtwitterなどのソーシャルメディアログイン機能を実装する方法について説明します。 ソーシャルメディアログイン機能の実装にはHybridauthのライブラリを使用します。 H [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Codeigniter4でfacebookやtwitterなどのソーシャルメディアログイン機能を実装する方法について説明します。</p>



<p>ソーシャルメディアログイン機能の実装にはHybridauthのライブラリを使用します。</p>



<h3 class="wp-block-heading"><span id="toc1">Hybridauthライブラリのインストール</span></h3>



<p>次のコマンドを実行してHybridauthライブラリをインストールします。</p>



<pre class="wp-block-code"><code># composer require hybridauth/hybridauth</code></pre>



<h3 class="wp-block-heading"><span id="toc2">設定ファイルの作成</span></h3>



<p>Configディレクトリ内にProvider.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;?php
 
namespace App\Config;

use CodeIgniter\Config\BaseConfig;

class Provider extends BaseConfig
{
  public $configure = &#91;
    // callback
    'callback' => 'https://www.example.com/auth/authenticate',
    'providers' => &#91;
      // facebook.
      'Facebook' => &#91;
        'enabled' => true,
        'keys' => &#91;
          'id' => '&lt;アプリID>',
          'secret' => '&lt;秘密キー>',
        ],
      ],
      // twitter
      'Twitter' => &#91;
        'enabled' => true,
        'keys' => &#91;
          'key' => '&lt;キー>',
          'secret' => '&lt;秘密キー>',
        ],
      ],
    ],
  ];
}</code></pre>



<p>アプリID、キー、秘密キーは各SNSのデベロッパーサイトで発行された値を指定します。</p>



<h3 class="wp-block-heading"><span id="toc3">コントローラーの作成</span></h3>



<p>Authコントローラーを作成します。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Controllers;

use Hybridauth\Hybridauth;
use Hybridauth\HttpClient;

class Auth extends BaseController
{
  public function index()
  {
    return view('auth');
  } 
  
  public function authenticate($provider = false)
  {
    $userProfile = &#91;];
    $config = new \App\Config\Provider();
    try {
      $auth = new Hybridauth($config->configure);
      $adapter = $auth->authenticate($provider);
      $tokens = $adapter->getAccessToken();
      $userProfile = $adapter->getUserProfile();
      $adapter->disconnect();
      
    } catch (\Exception $e) {
      echo $e->getMessage();
    }

    return view('result', &#91;'userProfile' => $userProfile]);
  }</code></pre>



<h3 class="wp-block-heading"><span id="toc4">ビューの作成</span></h3>



<p>ビューはログインとログイン後の画面を用意します。</p>



<h4 class="wp-block-heading"><span id="toc5">auth.phpの作成</span></h4>



<p>Viewsディレクトリにauth.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;html>
&lt;head>
&lt;title>ソーシャルメディアログインテスト&lt;/title>

&lt;meta charset="utf-8">
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
&lt;/head>
&lt;body>
&lt;a href="&lt;?php echo base_url('auth/authenticate/Facebook') ?>">Facebookアカウントでログイン&lt;/a>&lt;br>
&lt;a href="&lt;?php echo base_url('auth/authenticate/Twitter') ?>">Twitterアカウントでログイン&lt;/a>
&lt;/body>
&lt;/html></code></pre>



<h4 class="wp-block-heading"><span id="toc6">result.phpの作成</span></h4>



<p>Viewsディレクトリにresult.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;html>
&lt;head>
&lt;title>ソーシャルメディアログインテスト&lt;/title>

&lt;meta charset="utf-8">
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
&lt;/head>
&lt;body>
&lt;?php var_dump($userProfile) ?>
&lt;/body>
&lt;/html></code></pre>



<h3 class="wp-block-heading"><span id="toc7">動作確認</span></h3>



<p>次のURLへアクセスしてログインできるか確認します。</p>



<pre class="wp-block-code"><code>https:&#47;&#47;www.example.com/auth</code></pre>



<p>正常に動作していればソーシャルメディア上の登録ID、プロフィール名、サブネイル画像URLの表示が確認できます。</p>





<a rel="noopener" href="https://hybridauth.github.io" title="Hybridauth Social Login PHP Library" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fhybridauth.github.io?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Hybridauth Social Login PHP Library</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://hybridauth.github.io" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">hybridauth.github.io</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ComposerでCodeigniter3とIon-Authライブラリを導入する方法</title>
		<link>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/</link>
					<comments>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 23 Jul 2024 08:30:37 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Ion-Auth]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=81</guid>

					<description><![CDATA[パッケージ管理ツールのComposerを使用してCodeigniter3のインストールした上で認証ライブラリであるIon-Authのセットアップ方法を説明しています。 目次 インストールCodeigniterのインストー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>パッケージ管理ツールのComposerを使用してCodeigniter3のインストールした上で認証ライブラリであるIon-Authのセットアップ方法を説明しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16"><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">インストール</a><ol><li><a href="#toc2" tabindex="0">Codeigniterのインストール</a></li><li><a href="#toc3" tabindex="0">Ion-Authのインストール</a></li></ol></li><li><a href="#toc4" tabindex="0">データベースの設定</a><ol><li><a href="#toc5" tabindex="0">コマンド実行ファイルの作成</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">インストール</span></h2>



<h3 class="wp-block-heading"><span id="toc2">Codeigniterのインストール</span></h3>



<p>次のComposerコマンドでCodeigniter3をインストールします、</p>



<pre class="wp-block-code"><code># composer create-project kenjis/codeigniter-composer-installer ＜インストール先ディレクトリ名＞</code></pre>



<h3 class="wp-block-heading"><span id="toc3">Ion-Authのインストール</span></h3>



<p>次のComposerコマンドでIon-Authをインストールします。</p>



<pre class="wp-block-code"><code># cd ＜インストール先ディレクトリ名＞
# php bin/install.php ion-auth 2</code></pre>



<h2 class="wp-block-heading"><span id="toc4">データベースの設定</span></h2>



<p>データベースのスキーマを管理する機能を追加します。</p>



<h3 class="wp-block-heading"><span id="toc5">コマンド実行ファイルの作成</span></h3>



<p>以下のファイルを/application/controllers/内に設置します。</p>



<pre class="wp-block-code"><code>Migrate.php
&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Migrate extends CI_Controller {

    function __construct()
    {   
        parent::__construct();
        if(! $this->input->is_cli_request()) {
            show_404();
            exit;
        }   
        $this->load->library('migration');
    }   

    function current()
    {   
        if ($this->migration->current()) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }   

    function rollback($version)
    {   
        if ($this->migration->version($version)) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }   

    function latest()
    {   
        if ($this->migration->latest()) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }

}
マイグレーションの設定
application/config/migration.phpを次のように編集します。

&lt;?
// マイグレーションを有効化
$config&#91;'migration_enabled'] = TRUE;
// シーケンス番号で管理
$config&#91;'migration_type'] = 'sequential';</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
