2010-03-17 76 views
34

我找到关于模型和验证的示例和教程。我说的验证(或者至少大部分)应该在模型中,我同意这一点。但我不能有任何示例或教程来说明应该如何完成。Kohana 3:验证模型示例

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

希望有人能帮助,原因觉得这里有点失落:对

+0

我觉得很有趣,因此具有更好的Kohana 3文档不是项目本身。感谢您的好Q. – Brenden 2011-12-01 18:20:29

+0

嗯,实际上这些代码的记录非常好,并且与userguide模块的API部分配对,我认为它非常好。但可能是更多的例子,特别是在用户指南部分。很多TODO和丢失的东西:) – Svish 2011-12-02 10:01:06

回答

36

我也很难找到Kohana3的例子,bestattendance的例子是Kohana2。

这是我在我自己的测试一起扔了一个例子:

应用程序/类/模型/ 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; 
    } 
} 

应用程序/消息/ 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/n ews.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; 
    } 
} 

应用程序/视图/ 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 ?> 

为了得到这个代码在默认安装的工作,你就必须启用数据库模块,并配置它进行认证。然后你可以使用默认配置从index.php/news访问它。

它在Kohana 3.0.7中进行了测试,并且应该给你一个很好的开始你如何布置代码的方法。与其他框架不同的是,Kohana似乎对你放置逻辑的位置非常开放,所以这对我来说才是有意义的。如果要使用ORM而不是滚动自己的数据库交互,它有自己的验证语法,您可以查找here

+1

你的代码不应该在View中抛出关于不存在'$ validator ['title']'的通知吗? – zerkms 2012-02-16 01:11:34

+0

如果验证失败,@zerkms $ validator ['title']在视图中作为的默认文本。如果没有设置,则输入的默认值是没有意义的。该变量在bind('validator',$ validator)中定义,因此不存在对未定义变量的引用的危险。是的,一个关键的查找是在一个null上完成的,但是我不认为这是一个问题,除非你正在运行E_STRICT。 – preds 2012-02-21 07:07:32

+1

“没有引用未定义变量的危险”---存在未定义索引通知的危险 – zerkms 2012-02-21 07:13:54

4

下面是对我工作的一个简单的例子。

在我的模型(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.' 
) 
); 
+0

答复!难以置信。谢谢!将通过它看,看看我能从它得到的东西:) – Svish 2010-03-18 19:11:52

+0

@Svish如果它帮助你请接受答案。 – alex 2010-07-22 00:38:24

+1

这是KO3还是KO2? – Svish 2010-09-06 12:32:52

6

与ORM模型一起使用的KO3验证示例。例子在1986年(blaa)的许可下发布在#kohana(freenode)上。

<?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('Y-m-d 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; 
    } 
}