ホームページ  >  記事  >  バックエンド開発  >  PHP フレームワーク Codeigniter の優れたプラクティスのいくつか

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

伊谢尔伦
伊谢尔伦オリジナル
2016-11-26 14:23:57848ブラウズ

最近、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 までご連絡ください。