Kohana 3: Example of model with validation

后端 未结 4 1248

I find examples and tutorials about models and about validation. And I places that say the validation (or most of it at least) should be in the model, which I agree with. But I

相关标签:
4条回答
  • 2021-01-30 04:47

    I have a brief write up with how to handle this at the link below since it took me a while to figure out and I couldn't find a single good example.

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

    0 讨论(0)
  • 2021-01-30 04:51

    An example of KO3 validation used with ORM models. Example was posted with permission by a1986 (blaa) in #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;
      }
    }
    
    0 讨论(0)
  • 2021-01-30 05:01

    Here's a simple example that works for me.

    In my model (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'));
    }
    }
    
    ?>
    

    In my controller (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);
    }
    
       }
    ?>
    

    In my i18n file (form_errors.php):

    $lang = Array (
    'clientName' => Array (
    'required' => 'The Client Name field is required.'
    )
    );
    
    0 讨论(0)
  • 2021-01-30 05:05

    I too had difficulty finding examples for Kohana3, bestattendance's example is for Kohana2.

    Here's an example I threw together in my own 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 ?>
    

    To get this code working in a default install, you would have to enable the database module and configure it for authentication. Then you can access it from index.php/news using default configuration.

    It is tested in Kohana 3.0.7 and should give you a good starting point of how you might lay out code. Unlike other frameworks, Kohana seems to be very open ended as to where you put your logic so this is just what made sense to me. If you want to use the ORM instead of rolling your own database interaction, it has its own syntax for validation which you can find here

    0 讨论(0)
提交回复
热议问题