2013-07-21 8 views
1

Я новичок в CakePhp, я использую CakePhp 2.x. Я, вероятно, собираюсь решить проблему ниже неправильного пути. И я просто знаю, что меня упускают из виду что-то реальное просто, но .....cakephp 2.x включает userExists при проверке логина

Я проверяю данные для входа на основе «от 5 до 15 символов», они перестраивают ошибки, как ожидалось.

[The MODEL] 

public $validate = array(
    'username' => array(   
     'between' => array(
      'rule' => array('between', 5, 15), 
      'message' => 'Between 5 to 15 characters' 
     ) 
    ), 
    'password' => array(
     'rule' => array('minLength', '8'), 
     'message' => 'Minimum 8 characters long' 
    ) 

); 



[The CONTROLLER] 

public function login() { 

      if ($this->request->data) { 

       $this->User->set($this->request->data); 

       if ($this->User->validates() && $this->Auth->login()) { 

        if ($user = $this->Auth->user()) {      

         $this->render($this->Auth->redirect()); 

        }else{ 
         //?? 
        } 
       }else{ 
         $this->User->create(); 

        pr($this->User->invalidFields()); 

         $errors = $this->User->validationErrors; 

         $data = compact('errors'); 

         $this->set('errors', $data); 
         $this->set('_serialize', array('errors')); 

         $this->Session->setFlash('Your username/password combination was incorrect');          
       } 
      } 


    } 

Итак, проблема, если поля следовать правилам в модели выше, даже если регистрационные данные (пользователь) не существует, никакие ошибки не будут возвращены (не хорошо). Было бы правильным добавить другую проверку для этого, добавив другое правило, чтобы проверить, действительно ли этот пользователь существует? Если да, то как !?

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

Спасибо.

+1

Я думаю, что вы запутываете регистрацию (добавив пользователя) с логином (пользователь уже существует). Последний никогда не имеет никакой проверки. Вся проверка, включая «существует», должна выполняться, когда запись создается, а не когда ее слишком поздно, и вы уже пытаетесь зарегистрировать этого пользователя на основе действительных (и уже сохраненных) данных, которые он предоставляет. – mark

ответ

1

Было бы правильным добавить другое подтверждение для этого, добавив еще одно правило, чтобы проверить, действительно ли этот пользователь существует? Если да, то как !?

Вы можете добавить столько правил, как захотите. В этом случае вы хотите, чтобы правило было «уникальным». Read this section of the book about data validation.

Или, я работаю с этим в функции входа в контроллер, проверяя, существует ли пользователь ?

Все манипуляции и проверка данных должны происходить в модели слоя стека MVC. Поэтому ставьте все в модельный метод и передавайте ему данные сообщения и проверяйте их там. Вы можете поместить всю логику в контроллер, но это глупо, если не следовать шаблону MVC. Модели могут быть разделены между оболочками и контроллерами, например контроллером. Снова вы можете создать экземпляр контроллера в оболочке, но все это отрицает любую выгоду и идею, присущую шаблону MVC. Также модель легко тестируется. И да, вы должны выполнить модульный тест своего кода. Check how our users plugin is doing it например.

+0

Спасибо за ваши отзывы. – user1192941

+0

Мне кажется, мне нужен кто-то, чтобы показать мне, как добавить новое правило в массив проверки $ Model, который проверяет, существует ли пользователь. Я хочу, чтобы у вас была возможность сообщить пользователю сообщение об ошибке «Пользователь неизвестен». – user1192941

1

Вы можете указать несколько правил в поле зрения ...

Перейдите по этой ссылке, чтобы узнать больше об этом ...

http://book.cakephp.org/2.0/en/models/data-validation.html#multiple-rules-per-field

пример кода приведен ниже

<?php 

[IN The MODEL] 

//the following code checks if the username is notempty, is a valid email and is it already taken or not... 
public $validate = array(

    'username' => array(

     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Please enter a valid email.', 
     ), 

     'email' => array(
      'rule' => array('email'), 
      'message' => 'Please enter a valid email.', 
     ), 

     'isUnique' => array(
      'rule' => 'isUnique', 
      'message' => 'This username has already been taken.' 
     ) 
    ) 
); 
?> 
+0

Вы говорите: «проверяет, не является ли имя пользователя пустым/является действительным адресом электронной почты и уже принято или нет» Но это и проблема для меня. Что произойдет, если кто-то войдет в систему и ошибочно использует либо свое имя пользователя/пароль (поэтому проверка правильна, я не пустой и не следует правилам типа char/len). Как я могу дать пользователю сообщение с надписью «Имя пользователя/пароль неизвестно или неверно»? Я посмотрел на добавление функции в модель, которая запускается в $ validate, чтобы проверить, существует ли пользователь. Это произойдет, если все остальные проверки пройдут, но я все еще смотрю, как это сделать! – user1192941

+0

@ user1192941: эта часть вам нужно сделать в контроллере ... см. Этот базовый пример ... смотрите образец функции входа там .. Это даст вам идею .... http: //book.cakephp. орг/2,0/о/учебники-и-примеры/блог-Auth-пример/auth.html # аутентификация Логин-и-выход из системы –