laravel 背包控制器中的验证是否有限制?

mwngjboj  于 2023-03-31  发布在  其他
关注(0)|答案(3)|浏览(130)

Laravel具有强大而优雅的验证功能,如unique/ignore/where。Backpack的CRUD控制器允许从控制器中调用Laravel验证。
我很清楚如何在Backpack控制器中调用required这样的简单验证规则。

Rule::unique('users')
->ignore($user->id)
->where(function ($query) {
    return $query->where('location_id', 1);
})

有没有一种方法可以在Backpack CRUD控制器中调用复杂的验证?或者在这种情况下,我 * 必须 * 在请求中定义验证,而不是CRUD控制器?
是否有文档定义了哪些特定的Laravel验证技术可以在Backpack控制器中使用,哪些不可以?

abithluo

abithluo1#

试试这个,让我知道它是否适合你。

use Illuminate\Validation\Rule;

....
protected function setupCreateOperation()
    {
        // CRUD::setValidation(UserRequest::class);
        $ignore = request('id') != null ? request('id') : null ;

        $this->crud->setValidation([
            'username' => [
                Rule::unique('users')
                ->ignore($ignore)
                ->where(function ($query) {
                    return $query->where('location_id', 1);
                })
            ],
        ]);

        .....
    }

将“用户名”更改为您的特定字段
参考:https://backpackforlaravel.com/docs/5.x/release-notes#quickly-validate-forms-inside-crudcontroller-no-formrequest-need

6ie5vjzr

6ie5vjzr2#

谢谢你,@christmex。你绝对让我指明了正确的方向。
经过更多的研究和修改,我在CRUD控制器中为Groups表做了以下工作:

use Illuminate\Validation\Rule ;
...
    protected function setupCreateOperation()
    {
        CRUD::setValidation(GroupRequest::class) ;  // Just in case I decide to use it

        // Set up rules and messages for name_group field
        $rules = [
                'name_group' => 
                    [ 
                    'required',
                    Rule::unique('groups') -> ignore( request('id') ),
                    ],
                ] ;
        $messages = [
            'name_group.required' => 
                'Please enter a name for this Group.',
            'name_group.unique' => 
                'The name for this Group must be unique.',
                    ] ;
        CRUD::field('name_group') -> label('Group')
            ;
        // This MUST be called AFTER the fields are defined, never before.
        // See https://backpackforlaravel.com/docs/5.x/release-notes#define-validation-rules-directly-on-fields
        CRUD::setValidation( $rules, $messages ) ;

这很好用--name_group是必需的,而且它必须是唯一的,上面的代码使Backpack有相应的行为。
所以看起来我最初问题的答案是否定的,在Backpack控制器中没有验证限制。如果你可以使用Laravel的Rule:: facade来表达它,你可以在Backpack控制器中设置它。
然而,我将继续研究这个模式,因为我不太清楚这个模式是否会与其他字段的其他验证正确地交互。你可能确实可以在Backpack控制器中设置任何验证,但可能需要遵循一些特定的编码规则。
我们会看到...我会回来报告。

vsnjm48y

vsnjm48y3#

经过进一步的测试,我确定确实还有一些规则需要遵循。但首先,这里有一个更广泛的模式,它工作得很好:

//
// This field uses ->setValidation()
//
    CRUD::field('name_group')
        -> label('Group') ;

    $rules = [
            'name_group' => 
                [ 
                'required',
                Rule::unique('groups') -> ignore( request('id') ),
                ],
            ] ;
    $messages = [
        'name_group.required' => 
            'Please enter a name for this Group.',
        'name_group.unique' => 
            'The name for this Group must be unique.',
                ] ;

    CRUD::setValidation( $rules, $messages ) ;
//
// This field uses ->validationRules()
//
    CRUD::field('notes')
        -> validationRules('required')
        -> validationMessages([
            'required' => 'Please enter some notes for this Group.',
            ]) ;
//
// This is another field that uses ->setValidation()
//
    CRUD::field('description') ;

    $rules = [
        'description' => 
            [ 
            Rule::unique('groups') -> ignore( request('id') ),
            ],
        ] ;
    $messages = [
        'description.unique' => 
            'The description for this Group must be unique.',
                ] ;
    
    CRUD::setValidation( $rules, $messages ) ;

因此,规则似乎是:
1.您可以在控制器中逐个字段地使用setValidation(),对setValidation()的每次调用似乎都是相对于先前调用的累积,因此当您第二次调用setValidation()时不会丢失任何内容。
1.在同一个控制器中,需要简单验证的字段可以使用->validationRules() * 而不是 * setValidation()。换句话说,您可以在给定控制器中逐个字段地自由混合和匹配。
1.你***不能***做的是对单个字段使用 both 验证技术!我的测试表明,setValidation()会“清除”最近CRUD::field()语句中的任何validationRules()。因此,只要你不在单个字段中混合匹配验证技术 *,就应该没问题。
如果有人谁是Maven在内部的背包可以评论是否一切我写的是正确的和完整的,或不,这将是非常有帮助的所有背包用户,我敢肯定。谢谢!

相关问题