2016-07-12 20 views
0

私はcodeigniterについて嫌いなことの1つは、コントローラ内にある検証ロジックであり、簡単にコードを増やしてしまいます。除き、codeigniter 3のカスタム検証

class User_Create extends BS_Validator 
{ 
    protected $fields = array(
     'name' => 'Nome', 
     'email' => 'Email', 
     'password' => 'Senha', 
     'password_repeat' => 'Repetir senha' 
    ); 

    protected $rules = array(
     'name' => 'required|min_length[3]|max_length[50]', 
     'email' => 'required|min_length[8]|max_length[100]|valid_email|is_unique[users.email]', 
     'password' => 'required', 
     'password_repeat' => 'required|callback_password_repeat_check' 
    ); 

    public function password_repeat_check ($password_repeat) 
    { 
     return true; 
    } 
} 

すべてが魔法のように動作します:私は、このクラスを拡張し、各検証について

Class BS_Validator extends CI_Model 
{ 
    protected $rules = array(); 
    protected $fields = array(); 

    # Get keys of fields. 
    public function getStructure() 
    { 
     return array_keys($this->fields); 
    } 

    # Validate $_POST against the rules and fields. 
    public function validate() 
    { 
     $this->load->library('form_validation'); 

     foreach($this->rules as $key => $rule) 
     { 
      $this->form_validation->set_rules($key, $this->fields[$key], $rule); 
     } 

     return $this->form_validation->run($this); 
    } 
} 

:このロジックコントローラーを分離するために、私はform_validation libraryをインポートしたモデルを作成しましたカスタム検証メソッド。これは決して呼び出されません。この特定のケースでは、常に(pasword_repeat_check)エラーを返します。

この方法で何をすべきですか?

+0

あなたが作成していないのはなぜ'form_validation.php'は設定ライブラリの中にありますか?したがって、すべての検証ルールは単一の場所に保存され、codeigniterによって組み込み関数になります – Arun

+1

Codeigniter 3を使用しているので、Callableを見ましたか? http://www.codeigniter.com/user_guide/libraries/form_validation.html#callable-use-anything-as-a-rule – cartalot

+0

はい、また動作しませんでした。おそらく、私が作成したラッパー 'BS_Validator'の問題です。 –

答えて

0

また、単にそこにそれを置き換えるこの

ようにしてコールバック関数を定義することができます。それはあなたが

'password_repeat' => 'required|', 
         function($password_repeat) { 
         //your conditon 

         return true; 
        } 
0

それはこのように動作させるために管理することができませんでしたのに役立ちます願っています。

Form_validationクラスを拡張するために、librariesフォルダにファイルMY_form_validation.phpを作成しました。それと

class BS_Form_validation extends CI_Form_validation 
{ 
    protected $CI; 

    function __construct($rules = array()) 
    { 
     parent::__construct($rules); 
    } 

    public function password_repeat ($password_repeat) 
    { 
     return $_POST['password'] == $password_repeat; 
    } 
} 

私はrulesの代わりcallback rulesを作成することができ、それは(callback_接頭辞を必要とせずに)、以下のように呼び出すことができます。

protected $rules = array(
     'name' => 'required|min_length[3]|max_length[50]', 
     'email' => 'required|min_length[8]|max_length[100]|valid_email|is_unique[users.email]', 
     'password' => 'required', 
     'password_repeat' => 'required|password_repeat' 
    );