在Laravel 4中,合并规则集是如何实现的?

In Laravel 4, How are the merging rulesets implemented?

我正在使用 dwightwatson/validating 包在模型中创建验证规则。

我特别喜欢您可以为不同路线创建的自定义规则集。

型号

protected $rulesets = [
        'set_up_all' => [
            'headline' => 'required|max:100',
            'description' => 'required'
        ],
        'set_up_property' => [
            'pets' => 'required'
        ],
        'set_up_room' => [
            'residents_gender' => 'required',
            'residents_smoker' => 'required'
        ],
        'set_up_roommate' => [
            'personal_gender' => 'required',
            'personal_smoker' => 'required'
        ]
    ];

控制器

$post = new Post(Input::all());

if($post->isValid('set_up_all', false)) {
  return 'It passed validation';
} else {
  return 'It failed validation';
}

在上面的示例中,它可以很好地验证 set_up_all 规则集。现在我想结合几个规则集并一起验证所有规则集。

根据文档,该软件包提供了一种方法 merge rulesets。我只是不知道如何将提供的示例集成到我当前的流程中。

根据文档,我需要实现这一行:

$mergedRules = $post->mergeRulesets('set_up_all', 'set_up_property_room', 'set_up_property');


这是我的尝试,但没有成功:

if($mergedRules->isValid()) { ...

我收到以下错误:

Call to a member function isValid() on array


我也试过这个,但也没用:

if($post->isValid($mergedRules)) { ...

我收到以下错误:

array_key_exists(): The first argument should be either a string or an integer


关于如何实施合并规则集有什么建议吗?

据我所知 - mergeRulesets() returns 一组规则。

因此,如果您这样做 - 它可能会起作用:

$post = new Post(Input::all());
$post->setRules($post->mergeRulesets('set_up_all', 'set_up_property_room', 'set_up_property'));
if($post->isValid()) { 
     ///
}

我已经为 Laravel 4.2 (0.10.7) 发布了包的更新版本,现在允许您将规则传递给 isValid() 方法来验证它们。

$post->isValid($mergedRules);

其他答案也可以,但这种语法更好(并且不会覆盖模型上的现有规则)。