Kohana 3:validation模型的例子

我find关于模型和validation的例子和教程。 而我所说的validation(或者至less大部分)应该在模型中,我同意这一点。 但我不能有任何示例或教程来说明应该如何完成。

任何人都可以帮助我一个简单的例子,如何做到这一点? 你在哪里有模型的规则? validation会在哪里发生? 控制器如何知道validation是否通过? 控制器如何得到错误信息和类似的东西?

希望有人能帮忙,让这里感觉有点失落:p

我也很难findKohana3的例子,bestattendance的例子是Kohana2。

以下是我在自己的testing中投入的一个例子:

application / classes / model / news.php

<?php defined('SYSPATH') OR die('No Direct Script Access'); Class Model_News extends Model { /* CREATE TABLE `news_example` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `title` VARCHAR(30) NOT NULL, `post` TEXT NOT NULL); */ public function get_latest_news() { $sql = 'SELECT * FROM `news_example` ORDER BY `id` DESC LIMIT 0, 10'; return $this->_db->query(Database::SELECT, $sql, FALSE) ->as_array(); } public function validate_news($arr) { return Validate::factory($arr) ->filter(TRUE, 'trim') ->rule('title', 'not_empty') ->rule('post', 'not_empty'); } public function add_news($d) { // Create a new user record in the database $insert_id = DB::insert('news_example', array('title','post')) ->values(array($d['title'],$d['post'])) ->execute(); return $insert_id; } } 

application / messages / errors.php

 <?php return array( 'title' => array( 'not_empty' => 'Title can\'t be blank.', ), 'post' => array( 'not_empty' => 'Post can\'t be blank.', ), ); 

application / classes / controller / news.php

 <?php defined('SYSPATH') OR die('No Direct Script Access'); Class Controller_News extends Controller { public function action_index() { //setup the model and view $news = Model::factory('news'); $view = View::factory('news') ->bind('validator', $validator) ->bind('errors', $errors) ->bind('recent_posts', $recent_posts); if (Request::$method == "POST") { //added the arr::extract() method here to pull the keys that we want //to stop the user from adding their own post data $validator = $news->validate_news(arr::extract($_POST,array('title','post'))); if ($validator->check()) { //validation passed, add to the db $news->add_news($validator); //clearing so it won't populate the form $validator = null; } else { //validation failed, get errors $errors = $validator->errors('errors'); } } $recent_posts = $news->get_latest_news(); $this->request->response = $view; } } 

application / views / news.php

 <?php if ($errors): ?> <p>Errors:</p> <ul> <?php foreach ($errors as $error): ?> <li><?php echo $error ?></li> <?php endforeach ?> </ul> <?php endif ?> <?php echo Form::open() ?> <dl> <dt><?php echo Form::label('title', 'title') ?></dt> <dd><?php echo Form::input('title', $validator['title']) ?></dd> <dt><?php echo Form::label('post', 'post') ?></dt> <dd><?php echo Form::input('post', $validator['post']) ?></dd> </dl> <?php echo Form::submit(NULL, 'Post') ?> <?php echo Form::close() ?> <?php if ($recent_posts): ?> <ul> <?php foreach ($recent_posts as $post): ?> <li><?php echo $post['title'] . ' - ' . $post['post'];?></li> <?php endforeach ?> </ul> <?php endif ?> 

为了使这个代码在默认安装中工作,您必须启用数据库模块并将其configuration为进行身份validation。 然后你可以使用默认configuration从index.php / news访问它。

它在Kohana 3.0.7中进行了testing,应该给你一个很好的起点,说明如何devise代码。 与其他框架不同的是,Kohana似乎对你把逻辑放在哪里是非常开放的,所以这对我来说才是有意义的。 如果您想使用ORM而不是滚动您自己的数据库交互,它有它自己的validation语法,您可以在这里find

与ORM模型一起使用的KO3validation示例。 例子在#kohana(freenode)的许可下由a1986(blaa)发布。

 <?php defined('SYSPATH') or die('No direct script access.'); class Model_Contract extends ORM { protected $_belongs_to = array('user' => array()); protected $_rules = array( 'document' => array( 'Upload::valid' => NULL, 'Upload::not_empty' => NULL, 'Upload::type' => array(array('pdf', 'doc', 'odt')), 'Upload::size' => array('10M') ) ); protected $_ignored_columns = array('document'); /** * Overwriting the ORM::save() method * * Move the uploaded file and save it to the database in the case of success * A Log message will be writed if the Upload::save fails to move the uploaded file * */ public function save() { $user_id = Auth::instance()->get_user()->id; $file = Upload::save($this->document, NULL, 'upload/contracts/'); if (FALSE !== $file) { $this->sent_on = date('Ymd H:i:s'); $this->filename = $this->document['name']; $this->stored_filename = $file; $this->user_id = $user_id; } else { Kohana::$log->add('error', 'Não foi possível salvar o arquivo. A gravação da linha no banco de dados foi abortada.'); } return parent::save(); } /** * Overwriting the ORM::delete() method * * Delete the database register if the file was deleted * * If not, record a Log message and return FALSE * */ public function delete($id = NULL) { if (unlink($this->stored_filename)) { return parent::delete($id); } Kohana::$log->add('error', 'Não foi possível deletar o arquivo do sistema. O registro foi mantido no banco de dados.'); return FALSE; } } 

这是一个简单的例子,适合我。

在我的模型(client.php)中:

 <?php defined('SYSPATH') or die('No direct script access.'); class Client_Model extends Model { public $validation; // This array is needed for validation public $fields = array( 'clientName' => '' ); public function __construct() { // load database library into $this->db (can be omitted if not required) parent::__construct(); $this->validation = new Validation($_POST); $this->validation->pre_filter('trim','clientName'); $this->validation->add_rules('clientName','required'); } public function create() { return $this->validation->validate(); } // This might go in base Model class public function getFormValues() { return arr::overwrite($this->fields, $this->validation->as_array()); } // This might go in base Model class public function getValidationErrors() { return arr::overwrite($this->fields, $this->validation->errors('form_errors')); } } ?> 

在我的控制器(clients.php)中:

 <?php defined('SYSPATH') OR die('No direct access allowed.'); class Clients_Controller extends Base_Controller { public function __construct() { parent::__construct(); } public function index() { $content = new View('clients/read'); $content->foobar = 'bob.'; $this->template->content = $content; $this->template->render(TRUE); } /* A new user signs up for an account. */ public function signup() { $content = new View('clients/create'); $post = $this->input->post(); $client = new Client_Model; if (!empty($post) && $this->isPostRequest()) { $content->message = 'You submitted the form, '.$this->input->post('clientName'); $content->message .= '<br />Performing Validation<br />'; if ($client->create()) { // Validation passed $content->message .= 'Validation passed'; } else { // Validation failed $content->message .= 'Validation failed'; } } else { $content->message = 'You did not submit the form.'; } $contnet->message .= '<br />'; print_r ($client->getFormValues()); print_r ($client->getValidationErrors()); $this->template->content = $content; $this->template->render(TRUE); } } ?> 

在我的i18n文件(form_errors.php)中:

 $lang = Array ( 'clientName' => Array ( 'required' => 'The Client Name field is required.' ) ); 

我在下面的链接中简单地写下了如何处理这个问题,因为花了我一段时间才弄清楚,我找不到一个好的例子。

http://www.matt-toigo.com/dev/orm_with_validation_in_kohana_3