我有多个我希望通过人类可读的 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 尚未在使用中而不抛出模型的 rules() 异常?