我正在创建REST API,并希望将一些验证规则附加到CREATE和UPDATE端点。这两个端点的验证规则将完全相同,因此我希望只能在一个地方指定它们。来自Laravel背景,我通常创建表单请求,或将验证规则放在模型中的rules()
函数中。
但是我认为Lumen的验证方式有所不同,他们的文档建议将验证逻辑放入路由器:https://lumen.laravel.com/docs/master/validation
但是,就我个人而言,我认为这不是最佳选择,而是希望将其放入模型中。我尝试在模型中使用rules()
函数,但这似乎无能为力。
我的create
和update
方法如下:
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',
];
}
}
答案 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一样)。显然,您可以根据需要更改此工作流程。