Laravel复杂的独特验证脑筋急转弯

时间:2017-01-15 10:24:44

标签: php laravel validation

我接受了新工作的任务,无法找出有效的解决方案,也有可能实现这一目标。

在我的cms应用程序中,我创建了添加页面的选项。可以为多种语言添加页面。所以在我的数据库中我有两个表:

pages
id, is_default, page_parent, published, created_at, updated_at, deleted_at

page_translations
id, page_id, content, slug, locale

(locale是语言前缀(en,fr,de ...))

因此,在创建页面上,您需要为每种语言填写标题和内容。

管理员用户不应该能够创建两个具有相同标题的页面,因此我创建了一个规则:

private function generateRules() {
    foreach (\App\Models\SiteLanguages::all() as $language) {
        $page = $this->getPageInfoFromRequestByLanguage($language);
        $rules[$language->code. '.title'] = 'required|unique:page_translations,title,' . $this->generateRuleAppendix($page);
    }
    return $rules;
}


private function getPageInfoFromRequestByLanguage($language) {
    return $this->get($language->code);
}


private function weAreEditingPage($page) {
    return key_exists('id', $page);
}

private function generateRuleAppendix($page) {
    $append = '';
    if ($this->weAreEditingPage($page)) {
        $append = ',' . $page['id'];
    }
    return $append;
}

基本上,这段代码正在做的是检查我们正在编辑的页面,并将标题设置为唯一。问题是,好的,它正在运行,你不能添加具有相同名称的页面,但是,如果标题字段与其他语言标题相同,它也不会编辑页面。

因此,如果我编辑页面并设置 en:Test 的标题名称和 fr:Test 的标题,则由于唯一规则,页面将无法编辑

我需要一种能够在所有语言的编辑时更新标题的方法,这些字段可以是相同的,但它不能是同名的两个页面。

1 个答案:

答案 0 :(得分:-1)

我猜您的代码中存在拼写错误

    private function generateRules() {
        foreach (\App\Models\SiteLanguages::all() as $language) {
            $page = $this->getPageInfoFromRequestByLanguage($language);
            $rules[$language->code. '.title'] = 
'required|unique:page_translations,title,' . $this->generateRuleAppendix($page);
        }
        return $rules;
    }

错字在这里

... unique:page_translations,title,'。 $这 - > ...

引用内部额外的逗号,尝试将其删除并再次检查它是否正常工作