Kohana ORM 和验证,有问题
Posted
技术标签:
【中文标题】Kohana ORM 和验证,有问题【英文标题】:Kohana ORM and Validation, having problems 【发布时间】:2012-02-25 18:39:56 【问题描述】:尝试使用适用于 Kohana 3.2 的 ORM 进行验证。
目前我有我的模型:
<?php defined('SYSPATH') or die('No direct access allowed.');
class Model_Brand extends ORM
protected $_has_many = array('models' => array());
protected $_rules = array(
'name' => array(
'not_empty' => NULL,
'min_length' => array(3),
'max_length' => array(20),
),
'sku' => array(
'not_empty' => NULL,
'min_length' => array(3),
'max_length' => array(6),
),
);
这是我的控制器:
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Brand extends Controller_Layout
public function action_view()
$brands = ORM::factory('brand')->find_all();
$this->template->title = __('Brands');
$this->template->content = View::factory('brands/view' );
$this->template->content->set('brands', $brands);
public function action_edit()
if($_POST)
try
$brand = ORM::factory('brand', $this->request->param('id'));
$brand->values($_POST);
if($brand->check())
$brand->update();
$brand->save();
//go to brand/views
catch (ORM_Validation_Exception $e)
//pass errors to brand/edit
else
$brand = ORM::factory('brand', $this->request->param('id'));
$this->template->title = __('Edit Brand');
$this->template->content = View::factory('brands/edit' );
$this->template->content->set('brand', $brand);
我什至还没有进入错误部分。我遇到的问题是它验证任何输入而不是使用模型中的规则。此外,如果有人能告诉我应该如何设计这样的更新操作,那将是一个很大的帮助。谢谢。
【问题讨论】:
【参考方案1】:这就是我做模型验证的方式,我觉得它最直接和优雅。
首先,我在 rules() 方法中设置我的规则:
<?php defined('SYSPATH') or die('No direct access allowed.');
class Model_Brand extends ORM
public function rules()
return array(
'name' => array(
array('not_empty'),
array('min_length', array(':value', 3)),
array('max_length', array(':value', 20)),
)
'sku' => array(
array('not_empty'),
array('min_length', array(':value', 3)),
array('max_length', array(':value', 6)),
)
);
);
这就是我管理编辑操作的方式:
public function action_edit()
$brand = ORM::factory('brand', $this->request->param('id'));
if (!$brand->loaded())
throw new Kohana_Exception('Brand not found.');
$this->template->title = __('Edit Brand');
$this->template->content = View::factory('brands/edit')
->set('brand', $brand)
->bind('errors', $errors);
if ($this->request->method() === Request::POST)
try
$brand->values($this->request->post());
$brand->save();
// Success! You probably want to set a session message here.
$this->request->redirect($this->request->uri());
catch(ORM_Validation_Exception $e)
// Fail!
$errors = $e->errors('brand');
在我看来:
<?php if ($errors) ?>
<!-- display errors here -->
<?php ?>
<?php echo Form::open()?>
<fieldset>
<div class="field">
<?php echo
Form::label('name', __('Name')),
Form::input('name', $brand->name)
?>
</div>
<?php echo Form::submit('save', 'Save')); ?>
</fieldset>
<?php echo Form::close()?>
正如您在视图中看到的,我没有进行任何条件检查来查看表单字段中显示的内容,因为这是由模型中的数据管理的,而模型中的数据由控制器管理。
希望这会有所帮助,如果您需要进一步说明,请随时询问。
【讨论】:
哇,感谢您提供如此详细的答案。正是我想要的。以上是关于Kohana ORM 和验证,有问题的主要内容,如果未能解决你的问题,请参考以下文章