gpt4 book ai didi

php - KO3 : Automatically generate unique alias/slug using ORM filters?

转载 作者:行者123 更新时间:2023-12-02 22:33:18 25 4
gpt4 key购买 nike

我有多个对象,我希望可以通过人类可读的 URL 访问这些对象,因此我为所有数据库记录生成了别名(例如 blog.com/this-is-an-alias/)。

自动生成这些的最佳做法是什么?

我目前正在 Hook 模型的“values()”方法并在其中生成一个新别名(基于所需的“名称”字段),但我忍不住觉得这可以更优雅地完成,比如说, 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 尚未被使用() 异常?

最佳答案

我会像您提到的那样使用过滤器自动生成。以下是我的想法。对于过滤器功能,您可以传递一些特定参数,例如 :model:value:field,在这种情况下我会使用 :model 以访问当前模型的属性。

class Model_Category extends ORM {

public function filters()
{
return array(
'slug' => array(
array(array($this, 'create_slug'), array(':model')),
),
);
}

public function create_slug($model)
{
$model = ($model instanceof ORM) ? $model : $this;

$number = 1;

$slug = UTF8::transliterate_to_ascii($model->name);
$slug = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $slug);
$slug = UTF8::strtolower(trim($slug, '-'));
$slug = preg_replace("/[\/_|+ -]+/", '-', $slug);

while ( ! $this->unique_slug($slug))
{
if ( ! preg_match('/\d+$/', $slug))
{
$slug .= '-'.$number;
}
$slug = preg_replace('/\d+$/', $number++, $slug);
}

return $slug;
}

public function unique_slug($slug)
{
return (bool) DB::select(array('COUNT("*")', 'total_count'))
->from($this->_table_name)
->where('slug', '=', $slug)
->where($this->_primary_key, '!=', $this->pk())
->execute($this->_db)
->get('total_count');
}

}

以上示例可能功能不全,但我希望您能理解。

关于php - KO3 : Automatically generate unique alias/slug using ORM filters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com