Laravel 5自定义表单验证

时间:2016-07-29 12:48:16

标签: php forms validation laravel-5.2

我来自一个codeigniter背景(我知道有点过期)我在Laravel 5.2中创建自定义表单验证规则时遇到了一些小问题。 我检查的许多教程建议在路由文件中设置这样做并设置请求文件等,但我仍感到困惑。

我的需求非常简单。

我的产品类别包含子类别。 对于每个产品类别,都需要有一个默认子类别。 因此,在创建子类别时,我会勾选询问该子类别是否为默认类别。

如果已经创建的子类别被选为该类别的默认子类别,我需要表单验证器在子类别创建过程中的表单验证期间触发错误。

以下是我的代码中包含表单验证部分的部分。

    $attributeNames = array(
       'category_id' => 'UOM Category Name',
       'sub_category_name' => 'Sub Category Name',
       'is_default' => 'Default'
     );

    $validator =  Validator::make($request->all(), [
        'category_id' => 'required',
        'sub_category_name' => 'required|unique:sub_categories,sub_category_name',
        'is_default' => 'required', //POSSIBLE TRIGGER GOES HERE. In CI the a custom function name went here
    ]);
    $validator->setAttributeNames($attributeNames);
    if ($validator->fails()) {
        $response = new Response();
        return $response->setStatusCode(400, $validator->errors());
    } else {
      //proceed with store
    }

抱歉英语不好。 另外,我已经看到表单验证是在FormRequest上完成的。这是最佳做法吗?

2 个答案:

答案 0 :(得分:0)

是的,form requests存在。您可以使用命令php artisan make:request CreateSubCategoryRequest创建新的FormRequest,然后添加rules

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'category_id' => 'required|exists:categories,id', // If you're making sure the parent category ID exists
        'sub_category_name' => 'required|unique:sub_categories,sub_category_name',
        'is_default' => 'required|boolean'
    ];
}

对于您的默认子类别验证,我相信您要问的是如何验证父类别是否已具有默认子类别(每个主类别仅允许1个默认子类别)。在这种情况下,您应该为主类别记录分配default_subcategory_id字段,而不是在每个子类别本身。然后为默认子类别的主类别模型添加关系,并检查它是否为空。

答案 1 :(得分:0)

一如既往,laravel文档是您最好的朋友https://laravel.com/docs/5.2/validation#validation-quickstart

您可以通过多种方式选择验证请求的方式和位置。最佳实践取决于您的用例。

但是,对我来说,主要为特定实体创建请求类型是最好的。您可以使用artisan命令创建新的请求

php artisan make:request CategoryRequest 
// or whatever your entity is called

您将在app / Http / Requests中找到该文件。 您有一个规则功能,您可以在其中粘贴验证所需的规则

return [
    'category' => 'required|min:5'
];

要创建自定义规则,您可以将其放在AppServiceProvider.php

public function boot()
{
    // custom rule
    Validator::extend('foo', function($attribute, $value, $parameters, $validator) {
        return $value == 'foo';
    });
}

自定义验证规则:https://laravel.com/docs/5.2/validation#custom-validation-rules