2011-01-10 10 views
0

たとえば、コントローラのアクションが整数 "id"パラメータを必要とする場合、MVC/Zend Frameworkに必要な/有効な(URL)パラメータがある場合、誰が管理するべきですか

おそらくコントローラのアクションで以下のようなことをしますか?

if (isset($this->_getParam("id")) && is_numeric($this->_getParam("id"))) { ... } 

次に何idが有効であるかどうかについてはどうですか?例えば。その行はデータベースに存在しませんか?

答えて

2

単に

$validator = new Zend_Validate_Digits(); 
$id = $this->_getParam("id") ; 
$valid = $validator->isValid($id); 
if($valid){ 
    // its valid number 
}else{ 
// its not valid number 
} 

とidがDBに存在して存在であるかどうか、この例ではZend_Dbのを使用して、いくつかのvalidator ありますを使用することにより、カスタムバリデータを書き込むことができます

//Check that the email address exists in the database 
$validator = new Zend_Validate_Db_RecordExists(
    array(
     'table' => 'users', 
     'field' => 'emailaddress' 
    ) 
); 

if ($validator->isValid($emailaddress)) { 
    // email address appears to be valid 
} else { 
    // email address is invalid; print the reasons 
    foreach ($validator->getMessages() as $message) { 
     echo "$message\n"; 
    } 
} 
1

これらの2つのステップ...

  1. ているあなたのような与えられたデータの検証は、SQLまたはモデルinstanstiation

  2. 経由でDB内の対応する行のチェック

  3. をしたか、フォームの検証を介しました

$row = $db->fetchRow($db->select()->where('ID= ?', $id));

echo count($row); // check count

echo !empty($row); // untested ...should work to

+0

つまり、コントローラーで行う必要がありますか?私はルータの存在(おそらく正規表現ルート)を使ってパラメータの存在とタイプの検証が少なくともできるかどうか疑問に思っていた。 –

+0

コントローラーの1つの単語でYES。そして、tawfekovのソリューションはよりクリーンです。入力に1つのバリデータを使用し、DBエントリを検証するために1つのバリデータを使用できます。 – gabel

1

理論上、あなたのコントローラは、来るすべてのデータを処理できるはずですURLを介して。通常、私は何かをする前に、データの関連性を検証します(つまり、正当なデータベースのID、名前、コマンドなど)。私は実際には、url引数のベースライン型検証の必要性を感じなかった。 getParamは、値がnullの場合にデフォルトを指定することができますが、NULLのテストは確かに良い考えです。

とにかく、私がしなければならなかった場合、これはどうやってやるのですか。 注:私はこのコードを実際にテストしていません。それはすべて「理論上」です。

私のルートオブジェクトのdefaultsアレイにタイプ情報を渡します。

// assuming you're using an ini config for routes 
routes.myroute.defaults.arg_types.id[] = 'integer' 

// so your 'defaults' array will looks like: 

Array(
    [controller] => mycontroller 
    [action] => myactions 
    [arg_types] => Array 
    (
     [id] => Array 
     (
      [0] => notnull 
      [1] => integer 
    ) 

) 

) 

は、その後、私たちはディスパッチループ中に指定した設定データに基づいて、各引数の検証コントローラプラグイン記述します。明らかに

public function preDispatch($request) 
{ 
    $params = $request->getParams(); 
    $route = Zend_Controller_Front::getInstance()->getRouter()->getCurrentRoute(); 
    $type_args = $route->getDefault('type_args'); 


    foreach($params as $param) { 
     if (!in_array($param, $type_args)) { 
     continue; 
     } 

     foreach($type_args[$param] as $type) { 
     switch($type) { 
      case 'notnull': 
      // validate for null 
      break; 
      case 'integer': 
      // validate for integer 
      break; 
      // etc. 
     } 
     } 
    } 


} 

を、なるようにかなり多くのロジックがあります物事が検証されなかった場合の処置など、ここで扱われます。

関連する問題