ホームページ  >  記事  >  バックエンド開発  >  Codeigniter_PHP チュートリアルの優れた実践例

Codeigniter_PHP チュートリアルの優れた実践例

WBOY
WBOYオリジナル
2016-07-13 10:18:48857ブラウズ

Codeigniter の優れた実践例

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

1. まずはMVCです

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

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

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

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

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

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 サイトの実行中に、application/config/database.php ファイルで db_debug の値を定数 MP_DB_DEBUG に設定することです。

リーリー

コーディングとデバッグでは次のように設定します:

リーリー

4. セキュリティの問題は非常に重要です

フォームによって送信された POST データ、COOKIE データ、URI データ、XML-RPC データ、または SERVER 配列内のデータのいずれであっても、プログラムにデータを受信する前に、次の 3 つの手順を実行することをお勧めします。

    不良データをフィルタリングします。
  1. データを検証して、正しいタイプ、長さ、サイズなどを確認します (場合によっては、このステップが最初のステップの代わりになることもあります)
  2. データベースに送信する前にデータを変換します。
SQL インジェクション、XSS、CSRF については、それらを理解した上で、それらを防止する方法を採用するかどうかを決定する必要があります。 CI マニュアルのセキュリティ ガイドラインと入力およびセキュリティ カテゴリを参照できます。おそらく最も重要な原則は、データベースまたはファイル システムにデータを送信する前にすべてのユーザー入力をチェックすることです。

  • SQL注入。使用 CI 自带的 Active Record 可以解决这个问题。
  • XSS (跨站脚本)。通过设置 $config['global_xss_filtering'] = TRUE; 开启自动过滤POST和COOKIE中的跨站脚本攻击,但需要消耗一些资源。也可以在每次处理POST和COOKIE的时候单独使用,把第二个参数设为TRUE,如 $this->input->post('some_data', 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 库,不过也有一些其他很好的选择。

最流行的或许是 DataMapper OverZealous Edition (DMZ),还可以使用 Doctrine (这里有一个教程),另一个选择 RapidDataMapper 是作者自己的作品。

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_Controller 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 スタイルのサーバー絶対ファイル パスに変換します。具体的には、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 などのいくつかの関数が含まれています。いくつかの重要な関数; Compat は主に php4 と php5 の関数の互換性の問題を解決し、定数はファイルの読み取りと書き込みのアクセス許可に関するいくつかの定数を定義します。

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

次に、2 番目のクラス ライブラリであるフックがロードされます。このクラス ライブラリは Benchmark などのシステム ライブラリの下にあり、プログラムがコンパイルを開始する前に他のことを実行する機会を提供します。他のミッションでは約 8 つの機会が提供されます。詳細についてはユーザー ガイドを参照してください。ここでは最初のフックをインポートします。

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

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

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

まとめ

まずはこれくらいまとめて、後ほど追加していきます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/881582.html技術記事最近、Codeigniter を使用して他の人が書いたプロジェクトを引き継いで改善するための Codeigniter の優れた実践例がいくつか準備されています。私は以前 CI を使用したことがありますが、完全に自分の希望に従って書いており、CI に従っていませんでした...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。