4

こんにちは、読んでくれてありがとう。

要点を説明します。私は CodeIgniter 1.7.3 を使用して構築している Web サイト プロジェクトを持っており、これを十分に楽しんでいますが、CI 2.0+ へのアップグレードを検討しています。

コントローラー、モデル、ビューのフォルダーを CI 2.0 フレームワークに移動しただけですが、ページを表示しようとすると 500 サーバー エラーが発生しました。

調査を行った結果、すべてのコントローラーが「CI_Controller」を親クラスとして使用する必要があることがわかりました。また、コントローラー クラスにコンストラクターを含めたい場合は、その名前と親クラスの構文として "function __construct()" を使用する必要があることに気付きました。CI 2.0+ では、クラス名と同じ名前のコンストラクターの使用がサポートされなくなったようです。たとえば、「class Blogs extends CI_controller{ function Blogs(){parent::__construct();}}」はサポートされなくなりましたか? CI 変更ログを読んでいますが、バグ修正と新機能だけが表示され、古いバージョンの CI との互換性の問題については何もありませんか? 他に秘密の小さな落とし穴を知っている人はいますか?

ありがとう、

H

4

2 に答える 2

7

CI 2.x では、PHP4 とのすべての互換性が削除され、さらに多くの標準が更新され、PHP 5.3 に準拠するようになりました。これらの 1 つは、発生したコンストラクターの問題です。PHP 5.3 以降、この関数ClassName()はクラスのコンストラクターではなくなり、単なる別の関数になりました。__constructクラスの新しいインスタンスが作成されたときに実行する必要があるタスクを実行するには、関数を明示的に宣言する必要があります。parent::ClassName()これを考えると、その関数は親のコンストラクターではなくなるため、子コンストラクターを呼び出すことはもはや意味がないことがわかるはずです。

私が最近解決しなければならなかったもう 1 つの落とし穴は、$_GET配列がどのように処理されるかということです。1.x バージョンでは、クエリ文字列を使用して追加情報を返し、引き続き URI セグメントを使用してコントローラーと関数にルーティングすることができました。これは、特定のリクエストでサーバーとの間で送受信されるすべてのパラメーターを常に把握しているとは限らない AJAX 呼び出しで特に役立ちます。2.x バージョンでは、config.php ファイルに新しいオプション$config['allow_get_array']. TRUEクエリ文字列を使用する場合は、これを に設定する必要があります。そうしないと、$_GET各リクエストで CI の初期化ルーチンの一部として入力クラスが配列をクリアします。

落とし穴ではありませんが、プロジェクトに新しいアプリケーション ディレクトリを追加できるようにする config/autoload.php の新しいオプションが便利な場合があります。CI を使用して多数の異なるプロジェクトに取り組んでいて、作成した有用なライブラリを 1 つの場所に保持したい場合は、その場所を に追加できるようになりました$autoload['packages']。CI は、この配列内のすべてのパスにサブディレクトリ "controllers"、"models"、"libraries"、および "helpers" が含まれていることを想定しています。これらのディレクトリがなくても問題はありませんが、少なくともロードするものには必要になります。つまり、ライブラリはメイン アプリケーション フォルダと同様に /libraries に置かれます。

于 2011-06-18T05:18:54.243 に答える
6

1.7.x から 2.xへのアップグレードに関する公式ガイドを読みましたか?

要するに

  • モデルとコントローラーを更新して CI_Model と CI_Controller を拡張する
  • 親コンストラクターの呼び出しを更新する

    class Wow extends CI_Controller {

          function __construct()
          {
              parent::__construct();
                        //your stuff
          }
    
          function index()
          {
                   // just for example 
          }
        }
    
于 2011-06-18T04:59:09.160 に答える