ホームページ バックエンド開発 PHPチュートリアル PHP フレームワーク Codeigniter の優れたプラクティスのいくつか

PHP フレームワーク Codeigniter の優れたプラクティスのいくつか

Nov 26, 2016 pm 02:23 PM
codeigniter php PHPフレームワーク

最近、Codeigniter を使用して他の人が書いたプロジェクトを引き継いで改善する予定です。以前 CI を使用したことがありますが、完全に自分の希望に従って作成し、一部の CI ルーチンに従っていませんでした。一般の人が使うプロジェクトの場合は、フレームワークの仕様に従うのがベストなので、将来引き継いだときに笑われないようまとめておくと良いでしょう。

1. 1 つ目は MVC です

MVC をまだ知らない場合は、モデルでのデータ アクセス、コントローラーでのビジネス ロジック、および HTML コードの記述の価値をすぐに理解できるでしょう。ビュー。これまでこのモデルを使用してプログラミングしたことがない場合は、額にしわを寄せるかもしれませんが、試してみる機会を与えてください。

経験則としては、コントローラーに組み込む要素を減らし、「車輪の再発明をしない」という DRY 原則を忘れないようにすることです。同じコードを複数の場所に記述する場合は、その種類に応じてライブラリ、ヘルパー、またはモデルを作成するようにしてください。例えば、データベース接続クラスはよく使われるのでモデル化(システム側で提供)します。

MVC の本質を理解すると、これが習慣になり、MVC の簡潔なコードから多くの恩恵を受けるでしょう。

1 つの原則は、複雑な操作をモデルに任せることです。コントローラーはむしろアーキテクトに似ています。モデルは大変なお仕事です。ビューは画家です。コントローラーはモデルに何かを投げるだけでよく、データが異常であるかどうかを気にする必要はなく、フラグと対応するデータを返します。このように、MVC アーキテクチャが反映されます。

モデルは実際には電子レンジのような電化製品に似ており、使用方法がシンプルであればあるほど、より多くの人に好まれます。(食べ物を入れる - スタートを押す - OK、ご飯が炊き上がる)。インターフェイスは、モデルがアップグレードされ、コードが最適化されると、外部世界との結合度が高くなくなります。たとえ内部的にうまく書かれていないとしても、インターフェースはすっきりしていて使いやすいです。

2. アプリケーションとシステムのパス

システム フォルダーとアプリケーション フォルダーを Webroot の外に配置するのが最善です。index.php が FTP サーバーの /public_html/ パスの下に配置されるようにする必要があります。ルート ディレクトリ /system 。この場合、PHP ファイルには、index.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 サイトの実行中に db_debug の値を定数 MP_DB_DEBUG に設定することです:

ini_set('display_errors', 'Off');
error_reporting(0);
define('MP_DB_DEBUG', false);
ログイン後にコピー

実行中に

ini_set('display_errors', 'On');
error_reporting(E_ALL);
define('MP_DB_DEBUG', true);
ログイン後にコピー

4 に設定します。コーディングとデバッグ。セキュリティの問題は非常に重要です

フォームによって送信された 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 检查,在 Google 上搜索 "CSRF tokens" 学习更多关于在保护表单提交和 URL 链接的知识,在 Ajax 应用方面可以搜索 "double cookie submission" 或 "双提交 cookie"。

SPAM (垃圾留言和恶意注册)。通过保护你的邮件表单,评论表单,以及其他各种免费用户提交的数据来防止垃圾信息,一个简单的方法是只允许一个IP/User客户端在一分钟之内只能提交一次,一个比较好的方式是使用 Captcha ,CI2中内置了一个CAPTCHA的辅助函数。

5. 数据库 和 ORM

CodeIgniter 有一个自带的库 Active Record 能够帮助你在不使用 SQL 语句的情况下写查询语句。这在你不太精通 SQL 语句或不知道怎样防止SQL注入的情况下是一个很好的方法。

当你需要更强大的工具时,你可以考虑使用 Object Relational Mapper ,就是鼎鼎大名的 ORM 了,遗憾的是,CodeIgniter 没有自带 ORM 库,不过也有一些其他很好的选择。

6. 代码实践

编写简洁的代码,并且理解你的代码,不要只是复制粘贴别人的代码,并且不断提高编码能力。手册上的开发规范是一个能学习怎样更好编写代码的地方。

1. DRY。不要总是重复造轮子,把能重用的代码放在它应该在的地方,比如libraries, helpers 或者是 models,而不是controllers,一个经验准则:当你复制代码的时候,也许你已经第二次把它放在了错误的地方。

2. Caching (缓存)。缓存是一个提高性能的很好的方式,尤其是减少数据库的访问。可以参考网页缓存和数据库缓存,或者在论坛上搜索其他的可选方案,比如 MP_Cache 是作者自己的作品。

3. HTTP headers (HTTP头部)。在客户端你能够通过单独发送HTTP头部使浏览器缓存页面来提高性能,当你使用 AJAX 的时候你也需要了解它来禁止浏览器缓存。

一个禁止缓存的例子:

$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
$this->output->set_header("Pragma: no-cache");
ログイン後にコピー

一个长时间保持缓存的例子(比如 css, javascript):

$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));
ログイン後にコピー

7. 模板渲染不必每次都调用 header 与 footer

在 MY_Controller 头部和 __construct 函数中添加以下内容,用于设定默认的模版信息,其中 SITE_NAME 需要自己在 application/config/constants.php 里面自己定义:

class MY_Cont roller extends CI_Controller {
    protected $_data;    // 模版传值数组
    protected $_tplext;  // 默认模版后缀
    protected $_header;  // 默认头部模版
    protected $_footer;  // 默认底部模版
    public function __construct () {
        parent::__construct();
        $this->_data['title'] = SITE_NAME;
        $this->_tplext = '.php';
        $this->_header = 'templates/header';
        $this->_footer = 'templates/footer';
        // 开发模式下开启性能分析
        if (ENVIRONMENT === 'development') {
            $this->output->enable_profiler(TRUE);
        }
    }
}
ログイン後にコピー

8. 不必所有的类都继承 CI_Controller

新增的控制器不再继承 CI_Controller,而改继承 MY_Controller:

class Index extends MY_Controller {
    public function __construct () {
        parent::__construct();
    }
    /**
     * 前台首页
     */
    public function index () {
        $this->_data['title'] = '首页';  // 不指定则使用默认标题 SITE_NAME
        $this->_view('index/index');
    }
}
ログイン後にコピー

末了,再补充两个:

9. CodeIgniter的文件结构

cache用以存储缓存文件,codeigniter文件夹包含了CI的基类CI_Base,为了兼容php4和php5,CI_Base有两个版本,其中php4版本的CI_Base继承于CI_Loader。libraries里存放了大部分常用的类库,最主要的三个类:Model,View和Cotronller,自己写的任何mvc都要继承于已有的mvc类;helpers里是一些函数(方法)集合,用以辅助其他模块的方便工作。language是一个语言包,用以支持多语言。

application文件夹用以存储您的应用程序,CI已经在内部为您增加了一些子文件,包括models、views、controllers、config、errors、hooks和libraries。其中前三个文件夹是用以创建模型、视图和控制器的。您的大部分工作都应该是创建属于自己的MVC,并可在config里加入配置文件,libraries里加入一些对象和方法,用来辅助您的模型和控制器工作。而hooks也是对CI_Hooks的扩展,具体内容见下面的章节。

10. CodeIgniter的工作过程

当有一个http请求时,如http://www.google.com/blog/,首先进入CI的引导文件index.php。接下来我们看看index.php里做了哪些事情。

index首先设置了应用程序的文件夹名称为application,系统的文件夹名称为system,然后做了一系列严格的判断并转换为unix风格的服务器绝对文件路径,具体说来定义了两个比较重要的常量,APPPATH,应用程序的文件夹路径,根据分析可知,该路径可以和system同级:htdocs/application/,也可以放到system文件夹里面,作为其子文件夹:htdocs/system/application/,但推荐采用第二种方式,这样显得比较整齐;BASEPATH,网站文档的基本文件路径,写出来大概是htdoc/system/;到最后,index引导文件引入了codeigniter/codeigniter.php里。接下来我们看看codeigniter里做了什么事情。

codeigniter.php一上来就引入了三个文件:Common.php,Compat.php和config/constants.php,其中Common里包含了一些函数,用于载入类库的load_class,记录日志的log_message,和引入错误页面的show_404是几个重要的函数;Compat主要解决了php4和php5中的函数不兼容问题,而constants则定义了一些读写文件权限的常量。

次に、codeigniter は最初のクラス ライブラリである Benchmark を読み込みます。このクラス ライブラリの最も単純なアプリケーションの 1 つは、Web ページの開始からコンパイルの終了までにかかる時間を計算することで、先頭にマークを付けます。コンパイルとレンダリングが終了すると、マークを追加して、費やした時間を計算できます。

次に、2 番目のクラス ライブラリであるフックがロードされます。ベンチマークと同様に、このクラス ライブラリの機能は、プログラムがコンパイルを開始する前に他のことを実行する機会を提供することです。他のタスクを実行するために約 8 つの機会が提供されます。詳細については、ユーザー ガイドを参照してください。ここでは最初のフックをインポートします。

次に、Config、URI、Router、Output、およびその他のクラス ライブラリをそれぞれロードし、cache_override フックがあるかどうかを確認します。存在しない場合は、このフックを使用して、Output クラスの _display_cache メソッドを置き換える関数をスケジュールできます。 Output の _display_cache はキャッシュ コンテンツがあるかどうかを確認し、存在する場合はキャッシュを直接出力し、そうでない場合は実行を続行します。

その後、入力と言語のロードを続けます。前にロードされたクラス ライブラリはすべて参照であることに注意してください。それは、php のバージョンが最初に判断されることです。は php4 のバージョンです。Base4 の CI_Base は CI_Loader を継承しますが、Base5 では、CI_Base と CI_Loader には継承関係がないため、Loader が最初にロードされ、次に Base4 がロードされます。

次のステップも非常に重要なステップです。このステップは、コントローラー クラスをロードすることから始まります。これは参照ではなく、ルーターを通じて http アドレスが解析され、コントローラーとメソッドの名前が取得されます。次に、アプリケーションコントローラーを調べます。そのようなコントローラーとメソッドが存在するかどうかを調べます。存在しない場合はエラーが報告され、存在する場合は判断が開始されます。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles