2009-07-20 2 views

ответ

34

Честно говоря, я бы создал модель только для проверки. Вы можете создать модель, которая не использует таблицу, добавив

var $useTable = false; 

А затем создать массив проверки правила для каждого поля, которое необходимо проверить:

var $validate = array('login' => 'alphaNumeric','email' => 'email','born' => 'date'); 

Затем, в контроллере, сделать что-то вроде:

$this->MyModel->set($this->data); 
if($this->MyModel->validates()){ 
    // do stuff with valid data 
} 

Если вы действительно, действительно не может использовать модель, то вам придется просто цикл по каждому значению в $this->data в своем действии контроллера и проверить его с регулярным выражением или использовать Validation::[rule]() вещи, как:

if(Validation::email($someThingThatMightBeAnEmailAddress)){ 
    // do stuff with valid email address. 
} 
+0

Почему если (Validation :: электронной почты ($ someThingThatMightBeAnEmailAddress)) не работают на моем конце? – PinoyStackOverflower

+0

@PinoyStackOverflower Если вы не работаете, вы имеете в виду, что «Проверка класса» не найдена, тогда вам может потребоваться добавить App :: uses («Validation», «Utility»), чтобы включить класс Validation. –

-3

Я думаю, что мой первый вопрос будет: если у вас нет модели ... что вы проверки? Как правило, сбор данных будет выполнен для заполнения модели. Если вы используете альтернативный репозиторий данных (файл, веб-службы и т. Д.), Модель все равно будет подходящим способом доступа к этим данным и управления ими.

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

+1

Многие вещи не собирают данные, но все равно могут извлечь выгоду из проверки: поля поиска, формы входа, фильтрация поиска ... –

+3

это не ответ, работал бы как коммюник на вопрос – Costa

1

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

Сначала я сделал без класса модели, а затем увидел this quesion. Теперь я использую класс фиктивной модели, чтобы мои проверки были введены там, так как код в действии контроллера выглядит очень аккуратно.

9

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

Другая проблема с CakePHP заключается в том, что иногда правила валидации являются общими для нескольких моделей. Было бы неплохо перенести валидацию из модели, в основном, поведением в свою собственную подпапку. Таким образом мы можем повторно использовать их или использовать их без модели.

Другая проблема с проверкой заключается в том, что она зависит от псевдонима модели. Если у вас есть модель под названием «Электронная почта» без таблицы для проверки, то в опубликованной форме также должна использоваться «Электронная почта». Если форма использует псевдоним, отличный от контроллера, то вы должны установить действие. Много дополнительных шагов для проверки. Вы не можете повторно использовать эту модель снова, если ваша форма использует другую модель.

Итак, вот мой альтернативный подход.

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

Пример действия может выглядеть следующим образом;

function edit() 
{ 
    $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model')); 
    if(!empty($this->data)) 
    { 
     $model->validate = array(
      'subject'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ), 
      'message'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ) 
     ); 
     if($model->save($this->data)) 
     { 
      // validation was successful, but no data was actually saved 
     } 
    } 
} 

Ключевым моментом здесь является создание автоматической модели CakePHP.

 $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model')); 

Приведенные выше попытки найти модель по электронной почте в папке с образцами приложений. Когда он не будет найден, CakePHP автоматически создаст модель памяти для этого класса. Поскольку мы устанавливаем значение «table» в false, тогда это должно указывать CakePHP, что эта модель не использует таблицу.

Это работает до тех пор, пока в папке с образцами приложений действительно нет файла email.php. Как только эта модель будет создана в памяти. Он доступен из встроенной справки по форме. Это означает, что ошибки проверки корректно передаются в представление.

Вот пример файла вида.

<?php echo $this->Form->create('Email',array('action'=>array('controller'=>'mycontroller','action'=>'edit'))); ?> 
<?php echo $this->Form->input('subject'); ?> 
<?php echo $this->Form->input('message',array('type'=>'textarea')); ?> 
<?php echo $this->Form->submit(); ?> 

Теперь представление будет отображать ошибки проверки из модели электронной почты с помощью вспомогательного элемента формы. Это связано с тем, что реестр классов CakePHP сохранил копию автоматической модели EMail в памяти, к которой будет обращаться хелпер формы.

Если вы хотите использовать специальные правила валидации, вам придется поместить методы обратного вызова в файл app_model.php.

Эти методы испытаны в CakePHP 1.3

+1

Также тестировался в CakePHP 2.4.4. Замечательный ответ! Это было очень полезно для меня. – t3b4n

0

Класс проверки, который является подклассом Object используется модель класса для выполнения проверки в отношении правил проверки указанных в нем.

Можно напрямую создать класс проверки в любом контроллере или модели и использовать его методы для проверки достоверности любых данных, а не только входные данные из форм.

0

@ ThinkingMedia's answer заставил меня двигаться в правильном направлении, но $model->save($this-data) возвращал мне ложь, к сожалению, даже если форма была действительной. Я использую CakePHP 2.3.9 для справки.

Оказалось, что даже с 'table'=>false набор параметров, возвращаемый $success из save() был основан на $count > 0 строк, которые были созданы/обновлены/изменены. В моем случае без стола было указано $count из 0 и $success было false. Я в конечном итоге смешивания ссылочного ответа с этим similar question's solution иметь работу проверки должным образом без файла модели:

function edit() 
{ 
    $model = ClassRegistry::init(array('class'=>'YourFormName','table'=>false,'type'=>'Model')); 
    if($this->request-is('post')) 
    { 
     $model->validate = array(
      'some_field'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ), 
      'another_field'=>array(
       'rule'=>'notEmpty', 
       'required'=>true 
      ) 
     ); 
     $model->set($this->request->data) 
     if($model->validate($this->request->data) && empty($model->validationErrors)) 
     { 
      // validation was successful, but no data was actually saved 
     } 
    } 
}