Кто должен управлять, если в MVC / Zend Framework есть обязательные / действительные (URL) параметры - PullRequest
0 голосов
/ 10 января 2011

Например, если мое действие контроллера ожидает целочисленный параметр "id", что должно гарантировать, что требование выполнено?

Может быть, в действии контроллера сделать что-то подобное ниже?

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

Тогда как насчет того, действителен ли идентификатор?например.строка не существует в базе данных?

Ответы [ 3 ]

2 голосов
/ 10 января 2011

просто с помощью

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

и если идентификатор существует или не существует в БД, существует некоторый валидатор в этом примере используется zend_db, вы можете написать свой собственный валидатор

//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 голос
/ 10 января 2011

Теоретически, ваши контроллеры должны иметь возможность обрабатывать любые данные, поступающие через URL. Как правило, я проверяю актуальность данных (т. Е. Является ли это допустимым идентификатором базы данных, именем, командой и т. Д.), Прежде чем что-либо делать с ними. Я никогда не чувствовал необходимости проверки базовых типов в аргументах URL. Тестирование на NULL, безусловно, является хорошей идеей, хотя getParam позволяет вам указать значение по умолчанию, если значение будет нулевым.

В любом случае, вот как бы я это сделал, если бы мне пришлось. Примечание. Я не проверял этот код. Это все «в теории».

Я бы передавал информацию о типе в массив 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 
      )

  )

)

Затем я написал бы плагин Controller, который проверяет каждый аргумент на основе данных конфигурации, которые мы указали во время цикла отправки:

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.
        }
      }
    }


}

Очевидно, что здесь есть немного больше логики, например, что делать, когда что-то не подтверждается.

1 голос
/ 10 января 2011

Это два шага ...

  1. Проверка указанных данных, как вы сделали, или с помощью проверки формы

  2. Проверка на соответствиестрока в БД через инстанцирование SQL или модели

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

echo count($row); // check count

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...