Подтвердить что ты не робот

Как вы выполняете проверку формы без модели в CakePHP?

Мне нужно выполнить некоторую проверку. У меня нет модели в приложении.

Кто-нибудь знает, как сделать валидацию без модели? Можете ли вы показать мне, используя небольшой образец или выражение?

4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете выполнить проверку данных формы в 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(); ?>

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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->validates($this->request->data) && empty($model->validationErrors))
       {
           // validation was successful, but no data was actually saved
       }
   }
}

Ответ 5

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

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

Ответ 6

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

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