【发布时间】:2012-08-07 22:34:17
【问题描述】:
我希望通过人类可读的 URL 访问多个对象,因此我正在为所有数据库记录生成别名(例如 blog.com/this-is-an-alias/)。
自动生成这些的最佳做法是什么?
我目前正在挂钩模型的 'values()' 方法并在其中生成一个新别名(基于所需的 'name' 字段),但我不禁觉得这可以更优雅地使用,比如说, Kohana 的内置过滤器。
这是精简模型:
class Model_Category extends ORM {
// relevant rules:
public function rules(){
return array(
'alias' => array(
array('max_length', array(':value', 63)),
array(array($this, 'unique'), array(':field', ':value')),
),
'name' => array(
array('max_length', array(':value', 63)),
),
// (...)
);
}
// overrides default method:
public function values(array $values, array $expected = NULL){
if(!$this->_loaded){
if($values['name'] && !$values['alias'])
$values['alias'] = Helper_Form::to_alias($values['name']);
}
return parent::values($values, $expected);
}
}
仅供参考,to_alias 函数看起来像这样:
return strtolower(substr(trim(preg_replace('/[^0-9a-zA-Z]+/','-',$str),'-'),0,63));
所以,我的问题:
- 是否可以和/或建议从过滤器回调中访问模型的属性(被过滤的属性除外)? (到目前为止,我的测试似乎表明没有,或者充其量是不可靠的)
- 更重要的是,我如何构建唯一性测试? 即在自动生成别名后,如何确定 slug 尚未使用而不抛出模型的规则() 异常?
【问题讨论】:
标签: php orm filter kohana unique