2013-12-10 2 views
2

Я начинаю ставить валидацию/дезинфекцию в своих моделях codeigniter, а перед погружением в глубокие глубины я искал некоторые рекомендации по лучшим практикам. библиотека для контроллеров form validation великолепна, но, очевидно, я не хочу полагаться на контроллеры, чтобы отправлять мне хорошие данные.Как я должен обрабатывать ошибки в моих моделях Codeigniter?

В настоящее время я возвращаю значения bool, TRUE (или данные) при успешном завершении, FALSE при сбое, что очень затрудняет передачу сообщений об ошибках вызывающему абоненту. Я хотел бы уйти от ЛОЖНОСТИ при неудаче.

В то время как определенно не эксперт, я немного начал читать об исключениях и натолкнулся на них довольно много с внешними библиотеками, и они кажутся хорошим кандидатом на это. мой вопрос в том, является ли это целесообразным использование исключений? Ошибки модели ошибок?

возможный пример:

<?php 
class person_model extends CI_Model{ 

    public function getPersonById($personId){ 

     //check for int 
     if(!is_int($personId) OR $personId < 0){ 
      throw new Exception('Invalid person ID'); 
     } 

     //setup query 
     $this->db->select('*') 
      ->where('personId', $personId); 

     //run query 
     $result = $this->db->get('person'); 

     //failed to get 
     if(!$result){ 
      throw new Exception('DB query failed'); 
      //should i also return false? 
      return FALSE; 
     } 

     //got info 
     else{ 
      return $result; 
     } 
    } 
} 
?> 

спасибо за помощь!

EDIT:

Я должен сказать, что я весьма удивлен ответами предполагая, что проверка данных должно быть сделано только в контроллере. Модели - последний барьер для хранения данных. Модель - это данные и правила, применяемые к этим данным, ваша логика приложения. Проверка данных кажется мне логикой приложений. Также у вас может быть много контроллеров, получающих доступ к одному и тому же методу модели. Вы хотите полагаться на оба контроллера, выполняющих ту же проверку? Мне это кажется глупым.

Кроме того, не все данные поступают с пользовательского ввода, некоторые из них могут быть жестко закодированы в сценарий вашим программистом, пишущим контроллер. Что делать, если они передают строку, когда ваша модель ожидает целое число? Или передать неверно отформатированную дату? не должна ли модель говорить об этом.

Я открыт для обсуждения, но я считаю, что проверка данных ОТНОСИТЕЛЬНО относится к модели. (В дополнение к контроллеру, и даже представления (html5/JavaScript для удобства))

+1

ваши модели не должны содержать проверку, оставьте это на контроллерах и обратитесь к моменту dels для чистых данных. – Jakub

+0

Эндрю, ваши модели должны быть чистыми данными, их необходимо проверить перед моделью. Модель - это ваши данные, это не ваша логика, контроллер управляет этим. – Jakub

+0

вы сказали: «Да, я широко использую их в своих контроллерах, но они не созданы для моделей, поскольку они ищут данные POST». Это не совсем так, поскольку вы можете использовать валидацию формы CI в модели - она ​​работает точно так же так же. this-> input-> post также доступен в модели. – cartalot

ответ

0

Перейти к:

application/config/database.php 

и искать db_debug быть TRUE. Например:

... 
$db['default']['dbprefix'] = ''; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = TRUE; //<-- Have this to true 
$db['default']['cache_on'] = FALSE; 
$db['default']['cachedir'] = ''; 
... 
+0

перечитайте этот вопрос, не считая 'debug' – Jakub

+0

. Тогда это всего лишь дублированный вопрос: http://stackoverflow.com/questions/6217786/codeigniter-and-throwing-exceptions –

+0

Умм Джон прочитал вопрос, ОП хочет знать, как сделать валидацию в своих моделях, и если исключения - это путь. – Jakub

0

В моих моделях я никогда не делаю исключений или ошибок. Я всегда возвращаю false для запроса, который возвращает null. Если в коде есть ошибка SQL, вы будете автоматически уведомлены о создании кода. Я бы избегал бросать исключения, если ваш запрос не возвращает никаких результатов. Затем вы можете обработать запрос, если он возвращает false с вашим контроллером.

EDIT: Также вы должны проверить данные, запрашиваемые в базе данных в контроллере, а не на модели. По-моему, модель должна использоваться строго для запроса данных, а не для проверки ошибок/данных, вы можете сделать это перед передачей в контроллер при его отправке.

Пример:

Модель

function search_replies($term){ 
    $this->db->like('ticket_id', $term); 
    $this->db->or_like('reply_from', $term); 
    $this->db->or_like('reply_from_name', $term); 
    $this->db->or_like('reply_content', $term); 

    $query = $this->db->get($this->table_ticket_replies); 

    // Returns the result if the number of rows is greater than 0, returns false otherwise   
    if ($query->num_rows() > 0) return $query->result(); 
    return false; 
} 

Контроллер

function example_controller(){ 
    if($this->search_model->search_replies('Test')){ 
     $data['results'] = $this->search_model->search_replies('Test'); 
    } 

    $this->load->view('search_results', $data); 
} 

Посмотреть

<?php 
if(isset($results)){ 
    echo 'Retrieved Results'; 
    foreach($results as $result){ 
    } 
} else{ 
    ?> 
    <h2>No results for search term!</h2> 
    <?php 
} 
?> 
+0

спасибо за предложения. как FYI я не планировал бросать исключения для запросов, которые не возвращают никакие строки. –

1

самый простой способ я нашел, чтобы справиться с этим всегда проверьте отрицательное состояние сначала с помощью проверки if. это также упрощает проверку нескольких шагов.

всегда возвращайте что-то обратно из своих методов модели, когда это возможно. Как и в этом примере - нам нужно проверить форму - я бы использовал проверку правильности формы кода, чтобы проверить ее целое число и т. Д., Если он прошел проверку, тогда нам нужен $ personId для поиска в базе данных. Таким образом, вместо того, чтобы просто возвращает истину/ложь от проверки - если проверка проходит затем вернуть $ PersonId:

function getperson() { 
// Validate the form 
// AND if its valid, return the validated $personId 
// Note the separate private method if the validation failed 
if (! $personId = $this->person->_validateGetPersonForm()) { 
    $this->error_msg = 'Error in validating the form. Please use a number.'; 
$this->_showGetPersonFailed() ; } 

elseif (! $person = $this->person->getBy($personId) ) { 
$this->error_msg = 'There is no person in our records with the number:'. $personId; 
$this->_showGetPersonFailed() ; } 

else { $this->_showResultsFor($person) ; } 
    } 

$ this-> error_msg автоматически доступны для любого из ваших взглядов и потому, что мы вырвались проверки и поиск в базе данных - сообщение об ошибке легко подходит для точного условия. если поиск не удался, тогда существует частный метод _showGetPersonFailed(), чтобы снова отобразить форму. последнее, если/else обычно является успешным - существует отдельный частный метод обработки отображаемых результатов с соответствующими представлениями.

также предлагает не использовать слово «модель» в имени файла, например «person_model». он просто загромождает общее название и заставляет вас вводить слово модель снова и снова :-) подумайте об этом так: если вы вызываете что-то из контроллера и получаете результаты - это почти всегда будет моделью. и все ваши файлы моделей всегда будут находиться в папке с именами моделей.

+0

Проблема, с которой вы можете столкнуться с CI, - это именовать конфликты с контроллерами и моделями. вот почему это было предложение, которое я прочитал, чтобы добавить _model ко всем моделям. –

+0

один контроллер может вызывать многие модели. модели не вызывают контроллеры. поэтому конфликтов конфликтов имен не будет. его больше костыля, когда вы впервые учитесь. По той же причине я называл свои взгляды «contactform_view». просто не называйте папку той же самой вещи, что и файл. например, если у вас есть папка с именем «admin» в папке контроллера с кучей контроллеров администратора, вы также не можете иметь контроллер с именем «admin». – cartalot

0

Вы, наверное, пропустили эту часть страницы проверки формы в руководстве пользователя:

Showing Errors Individually

Использование:

echo form_error('field_name'); 

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

+0

он также пропустил, что валидация выполняется в контроллере, а не в модели. – Jakub

+1

Ну, зависит ... если вы посмотрите на My_Model в PyroCMS, в этом базовом классе выполняются проверки, которые распространяются на модели, определенные нами. Однако вы правы, мы не должны показывать ошибки через модели, которые должны быть оставлены на контроллерах. –

+0

Мне известно о form_error и т. Д., Но опять же они относятся к «представлениям» и косвенно к проверке формы контроллера, которую я уже использую. мой вопрос касается проверки модели. –

Смежные вопросы