流明-模型中的验证规则?

时间:2018-12-21 21:03:50

标签: laravel lumen

我正在创建REST API,并希望将一些验证规则附加到CREATE和UPDATE端点。这两个端点的验证规则将完全相同,因此我希望只能在一个地方指定它们。来自Laravel背景,我通常创建表单请求,或将验证规则放在模型中的rules()函数中。

但是我认为Lumen的验证方式有所不同,他们的文档建议将验证逻辑放入路由器:https://lumen.laravel.com/docs/master/validation

但是,就我个人而言,我认为这不是最佳选择,而是希望将其放入模型中。我尝试在模型中使用rules()函数,但这似乎无能为力。

我的createupdate方法如下:

public function create(Request $request)
{
    $product = Product::create($request->all());

    return response()->json($product, 201);
}

public function update($id, Request $request)
{
    $product = Product::findOrFail($id);
    $product->update($request->all());

    return response()->json($product, 200);
}

我是否可以将验证规则放入我的Product模型中,并使其自动运行?

这是我在模型中尝试执行的操作:

namespace App;    

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'price', 'description',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [];

    /**
     * Set model validation rules.
     *
     * @return array
     */
    public function validate()
    {
        return [
            'name' => 'required',
            'price' => 'required',
            'description' => 'required',
        ];
    }
}

2 个答案:

答案 0 :(得分:0)

相同的validate方法也应该在控制器级别可用。因此,如果您想重用这些规则,则可以执行以下操作:

private $product_rules = [
    'name' => 'required',
];

public function create(Request $request)
{
    $this->validate($request, $this->product_rules);
    $product = Product::create($request->all());

    return response()->json($product, 201);
}

public function update($id, Request $request)
{
    $product = Product::findOrFail($id);
    $this->validate($request, $this->product_rules);
    $product->update($request->all());

    return response()->json($product, 200);
}

答案 1 :(得分:0)

正如您所提及并按照Lumen validation documentation (as of 5.8)

  

Lumen不支持表单请求。如果您想使用表单请求,则应使用完整的Laravel框架。

Lumen与Laravel中的Form Requests提供的自动验证没有任何相似之处,因此您需要手动执行验证。

产品

class Product extends Model
{
    /**
     * Get model validation rules.
     *
     * @return array
     */
    public static function getValidationRules()
    {
        return [
            'name' => 'required',
            'price' => 'required',
            'description' => 'required',
        ];
    }
}

以上内容将您的Product模型验证规则定义为静态方法,所有Product对象的规则应相同。您可能要考虑在数据库中字段应为unique的情况,可以选择提供该方法的参数。

ProductController

class ProductController extends Controller
{
    public function create(Request $request)
    {
        // Perform your validation
        $validatedData = $request->validate(Product::getValidationRules());

        // The Product is valid
        $product = Product::create($request->all());

        return response()->json($product, 201);
    }

    public function update($id, Request $request)
    {
        $product = Product::findOrFail($id);

        // Perform your validation
        $validatedData = $request->validate(Product::getValidationRules());

        // The Product is valid
        $product->update($request->all());

        return response()->json($product, 200);
    }
}

如果以上操作使您的验证失败,则Lumen会自动将用户重定向到先前的位置,并且错误会闪现到会话中(与Laravel一样)。显然,您可以根据需要更改此工作流程。