0

わかりましたので、 CodeIgniter の柔軟性に大きな問題があります。私は、巨大なプロジェクト内のフォームへの入力を対象とする多くの個人的なルール (20 など) を持っています。

CodeIgniter による古典的な「callback_」システムを使用している間、すべてが機能します。メソッドをフォームチェックと同じクラスに入れるだけで、正しくチェックされます。

私の問題は:

1)コードをコピー/貼り付けせずに、これらすべてのルールを別のコントローラーの別の form_validation で使用したい。私たちは皆、それが汚い/悪であることを知っています。

2)理想的には、これらのルールを大きなライブラリに入れたいと思います。これには800行ほどかかるため、コントローラーに入れるのは良い考えではありません。私が言ったように、このプロジェクトは非常に巨大です。

解決策を探しているのは6時間ですが、まったくきれいなものはありません:

  • 私はすでにいくつかの一般的なルールを置くためのMY_Form_Validationを持っていますが、毎回無駄に呼び出すグローバルクラスに特定のルールを混在させるという考えは好きではありません。さらに、これらのルールには多くのライブラリ、モデル、$this->input->post() などのネイティブ CI コア メソッドが含まれており、すべてをこの MY_Form_Validation に入れるとエラーが発生します。良い解決策ではありません:(

  • コントローラー内で選択されたライブラリー・メソッドを再生成する「imports」という名前のメソッドを含むMY_Controllerを作成しました(PHP4 では、興味がある場合は「aggregate_methods」関数のようなものでした)。システムは完璧に動作しますが、CodeIgniter はそれを理解していません。メソッドはコントローラー内で呼び出すことができますが、フレームワークは $CI コンテンツをチェックしてルールを呼び出すようです (「/system/」の Form_validation.php 行 590)。このコア部分を修正するのも難しく、手をつけたくないので断念しました。

$this->load->library('volt/lbl_validation'); $this->imports('Lbl_validation'); // 次に、コントローラで $this->method() を使用して任意の $this->lbl_validation->method() を呼び出すことができます

  • ライブラリ内でカスタマイズされた form_validation を作成する CI をハックしようとしました ('lbl_validation') ; システムは少し面倒でしたが、うまくいきました。問題は、エラー メッセージを表示するために CI form_validation システムに戻ったときです。これは、うまく機能していない真のスパゲッティ コードでした。どちらも良い解決策ではありません

私は他のいくつかのくだらない解決策も試しましたが、私はそれを告白したくありません.

今、私は自分のコンピューターの前にいて、なぜ善良な人々に悪いことが起こったのか、CodeIgniter で呼び出されたメソッドから set_rules を分離するのがなぜこれほど難しいのか、なぜ彼らは前もって計画を立てなかったのか、人々がライブラリを呼び出す必要があったのかを自問しています。ルールとしてのメソッド。どうすればいいのかわからず、馬鹿げた require() をどこかに置いて、今の私の机のように汚くて散らかしてしまうのをためらっています。

たぶん、良いダンズクリーンソリューションを持っている人がいます。私の希望はすべて StackOverFlow コミュニティに向けられています。誰か ?クレイジーな CI オタクですか?

ありがとうございました ;)

4

1 に答える 1

3

The only good, DRY way to handle validation is to put validation rules at the last resort before saving to the the database, in other words in the models. By doing this, the same rules can be used in any controller or library without being redefined.

The following idea is taken from Jamie Rumbelows excellent Codeigniter handbook:

Simply create an array in your model:

$validate = array(
    array( 'field' => 'username', 'label' => 'Username', 'rules' => 'required,trim' ),
    array( 'field' => 'password', 'label' => 'Password', 'rules' => 'required|min_length[8]' )
);

Then implement a method that you can use to validate your data prior to save()

function validate($data) {
    if (!empty($this->validate)) {
        foreach ($data as $key => $value) {
           $_POST[$key] = $value; }
           $this->load->library('form_validation');
           $this->form_validation->set_rules($this->validate);
           return $this->form_validation->run(); }
    else
    {
        return TRUE;
    } 
}

Now, in your controllers you can use:

if ($this->user->validate($user))
    save...
于 2013-09-15T15:36:08.967 に答える