最近、Codeigniter を使用して他の人が書いたプロジェクトを引き継いで改善する予定です。以前 CI を使用したことがありますが、完全に自分の希望に従って作成しており、一部の CI ルーチンに従っていませんでした。一般の人が使うプロジェクトの場合は、フレームワークの仕様に従うのがベストなので、将来引き継いだときに笑われないようまとめておくと良いでしょう。
1. まずは MVC
MVC をまだ知らない場合は、できるだけ早く学習する必要があります。モデル内のデータにアクセスし、コントローラーでビジネス ロジックを実行し、ビューで HTML コードを記述することの価値がすぐにわかります。これまでこのモデルを使用してプログラミングしたことがない場合は、額にしわを寄せるかもしれませんが、試してみる機会を与えてください。
経験則としては、コントローラーに組み込む要素を減らし、「車輪の再発明をしない」という DRY 原則を忘れないようにすることです。同じコードを複数の場所に記述する場合は、その種類に応じてライブラリ、ヘルパー、またはモデルを作成するようにしてください。例えば、データベース接続クラスはよく使われるのでモデル化(システム側で提供)します。
MVC の本質を理解すると、これが習慣になり、MVC の簡潔なコードから多くの恩恵を受けるでしょう。
原則の 1 つは、複雑な操作をモデルに任せることです。コントローラーはむしろアーキテクトに似ています。モデルは大変なお仕事です。ビューは画家です。コントローラーはモデルに何かを投げるだけでよく、データが異常であるかどうかを気にする必要はなく、フラグと対応するデータを返します。このように、MVC アーキテクチャが反映されています。
モデルは実際には電子レンジのような電化製品に似ており、使い方が簡単であればあるほど、より多くの人に好まれます (食べ物を入れてスタートを押し、ご飯が炊き上がります)。インターフェイスが少ないのは、モデルのアップグレード コードが最適化されているためです。当時は、外部世界との結合は高くありませんでした。たとえ内部的にうまく書かれていないとしても、インターフェースはすっきりしていて使いやすいです。
2. アプリケーションとシステムのパス
システム フォルダーとアプリケーション フォルダーを Webroot の外に配置するのが最善です。index.php が FTP サーバーの /public_html/ パスの下に配置されている場合は、システムをルート ディレクトリ /system の下に配置するようにしてください。この場合、index.php を通じてアクセスできるのは PHP ファイルのみです。
index.php ファイル内の $system_folder と $application_folder の値を変更することを忘れないでください。$system_folder の値は、index.php ファイルに対して相対的である必要があり、$application_folder の値は相対的である必要があります。システムディレクトリに。
3. エラーの報告とデバッグ
よくある間違いは、PHP エラーとデータベース エラーのレポートをオフにするのを忘れることです。これは危険です。公開サイトでは、error_reporting は 0 に設定する必要があり、データベース設定 db_debug は false に設定する必要があります。ini_set('display_errors') は、エラー情報が表示されないように設定します。 、「オフ」);
コーディングとデバッグを行うときは、アプリケーションをリリースする前に、error_reporting を E_ALL に設定し、すべてのメモと警告に対処する必要があります。
簡単な方法は、Web サイトの実行中に、application/config/database.php ファイルで db_debug の値を定数 MP_DB_DEBUG に設定することです。
コードをコピー コードは次のとおりです:
ini_set('display_errors', 'オフ');
error_reporting(0);
定義('MP_DB_DEBUG', false);
コードをコピー コードは次のとおりです:
ini_set('display_errors', 'オン');
error_reporting(E_ALL);
定義('MP_DB_DEBUG', true);
フォームによって送信された POST データ、COOKIE データ、URI データ、XML-RPC データ、または SERVER 配列内のデータのいずれであっても、プログラムにデータを受信する前に、次の 3 つの手順を実行することをお勧めします。 🎜>
不良データをフィルタリングします。データを検証して、タイプ、長さ、サイズなどが正しいことを確認します (場合によっては、このステップが最初のステップの代わりになることもあります)
データベースに送信する前にデータを変換します。
SQL インジェクション、XSS、CSRF については、それらを理解した上で、それらを防止する方法を採用するかどうかを決定する必要があります。 CI マニュアルのセキュリティ ガイドラインと入力およびセキュリティ カテゴリを参照できます。おそらく最も重要な原則は、データベースまたはファイル システムにデータを送信する前にすべてのユーザー入力をチェックすることです。
SQL インジェクション。 CI に付属する Active Record を使用すると、この問題を解決できます。
XSS (クロスサイト スクリプティング)。 $config['global_xss_filtering'] = TRUE; を設定すると、POST および COOKIE でのクロスサイト スクリプティング攻撃の自動フィルタリングが有効になり、一部のリソースが消費されます。 POST と COOKIE が処理されるたびに個別に使用することもでき、$this->input->post('some_data', TRUE); のように 2 番目のパラメーターを TRUE に設定します。フォーム検証クラスは XSS も提供します。 $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
などのフィルタリング オプション
CSRF (クロスサイト リクエスト フォージェリ)。 CI 2.0 には CSRF チェックが組み込まれています。フォーム送信と URL リンクの保護について詳しくは、Google で「CSRF トークン」を検索し、「double cookie submit」または「double submit cookie」を検索してください。
SPAM (スパムおよび悪意のある登録)。電子メール フォーム、コメント フォーム、その他のユーザーが送信したさまざまな無料データを保護することで、スパムを防止します。これを行うための簡単な方法は、1 分間に 1 つの IP/ユーザー クライアントのみに送信を許可することです。 CI2 には CAPTCHA 補助機能が組み込まれています。
5. データベースと ORM
CodeIgniter には、SQL ステートメントを使用せずにクエリ ステートメントを作成できる組み込みライブラリ Active Record があります。これは、SQL ステートメントにあまり熟練していない場合、または SQL インジェクションを防ぐ方法がわからない場合に適した方法です。
より強力なツールが必要な場合は、有名な ORM である Object Relational Mapper の使用を検討できます。残念ながら、CodeIgniter には ORM ライブラリが付属していませんが、他にいくつかの優れたオプションがあります。
おそらく最も人気のあるのは DataMapper OverZealous Edition (DMZ) です。Doctrine を使用することもできます (ここにチュートリアルがあります)。もう 1 つのオプションである RapidDataMapper は作者自身の作品です。
6. コードの練習
簡潔なコードを作成して自分のコードを理解し、他の人のコードをコピーして貼り付けるだけでなく、コーディング スキルを向上させ続けてください。ハンドブックの開発ガイドラインは、より良いコードの書き方を学ぶ場所です。
1. 乾燥します。車輪の再発明を繰り返さないでください。コントローラーではなく、ライブラリ、ヘルパー、モデルなど、再利用可能なコードを配置してください。コードをコピーするときは、すでに 2 回目のコードが配置されている可能性があります。間違った場所。
2. キャッシング。キャッシュは、特にデータベースへのアクセスを減らすことにより、パフォーマンスを向上させる優れた方法です。 Web ページのキャッシュとデータベースのキャッシュを参照したり、フォーラムで他のオプションを検索したりできます。たとえば、MP_Cache は作者自身の作品です。
3. HTTP ヘッダー。クライアント側では、別の HTTP ヘッダーを送信してブラウザーにページをキャッシュさせることでパフォーマンスを向上させることができます。また、AJAX を使用する場合はブラウザーのキャッシュを無効にすることを認識する必要があります。
キャッシュを無効にする例:
コードをコピー コードは次のとおりです:
$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
$this->output->set_header("キャッシュ制御: no-store、no-cache、must-revalidate");
$this->output->set_header("キャッシュ制御: post-check=0, pre-check=0", false);
$this->output->set_header("プラグマ: no-cache");
コードをコピー コードは次のとおりです:
$this->output->set_header('Cache-Control: private, pre-check=0, post-check=0, max-age=2592000');
$this->output->set_header('Expires: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() + 2592000));
$this->output->set_header('Last-Modified: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() - 20)); 🎜>
MY_Controller ヘッダーと __construct 関数に次の内容を追加して、デフォルトのテンプレート情報を設定する必要があります。SITE_NAME は application/config/constants.php で定義する必要があります。
コードをコピー コードは次のとおりです:
クラス MY_Controller は CI_Controller を拡張します {
protected $_data; // テンプレート値の配列
protected $_tplext; //デフォルトのテンプレートサフィックス
protected $_header; // デフォルトのヘッダー テンプレート
protected $_footer; // デフォルトの下部テンプレート
パブリック関数 __construct () {
parent::__construct();
$this->_data['title'] = SITE_NAME;
$this->_tplext = '.php';
$this->_header = 'テンプレート/ヘッダー';
$this->_footer = 'テンプレート/フッター';
// 開発モードでパフォーマンス分析を有効にする
If (環境 === '開発') {
$this->output->enable_profiler(TRUE);
}
}
}
8. すべてのクラスが CI_Controller
を継承する必要はありません。新しく追加されたコントローラーは CI_Controller を継承せず、代わりに MY_Controller を継承します:
コードをコピー コードは次のとおりです:
class Index extends MY_Controller {
パブリック関数 __construct () {
parent::__construct();
}
/**
* トップページ
*/
パブリック関数インデックス () {
$this->_data['title'] = 'ホームページ' // 指定しない場合、デフォルトのタイトルが使用されます SITE_NAME
;
$this->_view('index/index');
}
}
9. CodeIgniter のファイル構造
cache は、キャッシュ ファイルを保存するために使用されます。 codeigniter フォルダーには、php4 および php5 と互換性を持たせるために、CI_Base の 2 つのバージョンが含まれています。ライブラリには、一般的に使用されるクラス ライブラリのほとんど (Model、View、Cotronller) が格納されます。作成する mvc は、便利な作業を支援するために、既存の mvc クラスから継承する必要があります。他のモジュールの。 language は、複数の言語をサポートする言語パッケージです。
アプリケーション フォルダーは、モデル、ビュー、コントローラー、構成、エラー、フック、ライブラリなどのサブファイルを内部的に追加するために使用されます。最初の 3 つのフォルダーは、モデル、ビュー、コントローラーの作成に使用されます。作業のほとんどは独自の MVC を作成することであり、構成ファイルを config に追加し、一部のオブジェクトとメソッドをライブラリに追加して、モデルとコントローラーの動作を支援できます。フックも CI_Hook の拡張です。詳細については、次の章を参照してください。
10. CodeIgniter の作業プロセス
http://www.google.com/blog/ などの http リクエストがある場合は、まず CI ブート ファイルindex.php を入力します。次に、index.php で何が行われているかを見てみましょう。
index は、まずアプリケーション フォルダー名を application に設定し、システム フォルダー名を system に設定します。次に、一連の厳密な判断を行って、それらを Unix スタイルのサーバー絶対ファイル パスに変換します。具体的には、より重要な 2 つの定数を定義します。 APPPATH は、アプリケーションのフォルダー パスです。分析によると、このパスはシステム フォルダーと同じレベル (htdocs/application/) に置くことも、システム フォルダーにそのサブフォルダーとして配置することもできます (htdocs/system/application/)。ただし、よりすっきりとした 2 番目の方法を使用することをお勧めします。Web サイト ドキュメントの基本ファイル パスである BASEPATH は、最終的には htdoc/system/ になり、インデックス ブート ファイルは codeigniter/codeigniter.php に導入されます。次に、codeigniter で何が行われるかを見てみましょう。
codeigniter.php は、最初に Common.php、Compat.php、config/constants.php の 3 つのファイルを紹介します。 Common には、クラス ライブラリをロードするための load_class と、ログを記録するための log_message 、およびエラーを引き起こす show_404 を含むいくつかの関数が含まれています。 Pages はいくつかの重要な関数です。Compat は主に php4 と php5 の関数の互換性の問題を解決し、constants はファイルの読み取りおよび書き込み権限に関するいくつかの定数を定義します。
次に、codeigniter は最初のクラス ライブラリである Benchmark を読み込みます。このクラス ライブラリの最も単純なアプリケーションの 1 つは、Web ページのコンパイルの開始から終了までにかかる時間を計算するため、先頭にマークを付けます。レンダリングが完了し、マークが追加された後、費やした時間を計算できます。
次に、2 番目のクラス ライブラリであるフックがロードされます。ベンチマークと同様に、このクラス ライブラリの機能は、プログラムのコンパイルが開始される前に他のことを実行する機会を提供することです。他のタスクを実行するための 8 つの機会が提供されています。詳細については、ユーザー ガイドを参照してください。ここでは最初のフックをインポートします。
次に、Config、URI、Router、Output、およびその他のクラス ライブラリをそれぞれロードします。次に、cache_override フックがあるかどうかを確認します。存在しない場合は、このフックを使用して、Output クラスの _display_cache メソッドを置き換える関数をスケジュールできます。 、直接 Output の _display_cache を呼び出して、キャッシュ コンテンツがあるかどうかを確認し、存在する場合はキャッシュを直接出力し、存在しない場合は実行を続行します。
その後、入力と言語の読み込みを続けます。前に読み込まれたクラス ライブラリはすべて参照であることに注意してください。次に、CI_Base オブジェクトの読み込みという重要な読み込みが行われます。 php4 版の場合、Base4 の CI_Base は CI_Loader を継承しているため、Loader がロードされてから Base4 がロードされますが、Base5 では CI_Base と CI_Loader には継承関係がありません。
次のステップも非常に重要なステップです。このステップは、コントローラー クラスをロードすることから始まり、ルーターを通じて http アドレスが解析され、コントローラーとメソッドの名前が取得されます。次に、アプリケーションコントローラーを調べます。そのようなコントローラーとメソッドが存在するかどうか、存在しない場合はエラーが報告されます。
概要
まずはこれくらいまとめて、後ほど追加していきます。皆さんも気に入っていただければ幸いです。