Laravel 5表单请求验证与参数

11

我正在使用表单请求验证,其中有一些规则需要外部值作为参数。

这是编辑商业资料的验证规则,位于一个表单请求类中:

public function rules()
{
    return [
        'name' => 'required|unique:businesses,name,'.$business->id,
        'url' => 'required|url|unique:businesses'
    ];
}

我可以通过类型提示在控制器上使用它。

public function postBusinessEdit(BusinessEditRequest $request, Business $business)
{
    //
}

但是如何将$business对象作为rules方法的一个参数传递?


将模型(我假设$business是一个模型)导入到您的请求类中,并手动获取对象。 - Nehal Hasnayeen
@NehalHasnayeen 是的,业务逻辑是一个模型,但它被类型提示到使用路由模型绑定的控制器方法上。 - Dipendra Gurung
6个回答

10

假设这是您的模型绑定:

$router->model('business', 'App\Business');

然后您可以像这样从FormRequest对象中引用Business类:

public function rules()
{
    $business = $this->route()->getParameter('business');
    // rest of the code
}
注意,如果你在创建和更新验证时都使用了同一个表单请求,当创建记录时,business变量会是null,因为你的对象还不存在。因此,在引用对象属性或方法之前,请注意进行必要的检查。

你可以使用更短的 $this->route('business') - ml59

9

有很多方法可以实现此目的。我采用以下方式:

您可以在业务表单中添加一个隐藏字段'id',如下所示:

{!! Form::hidden('id', $business->id) !!}

您可以在以下FormRequest中检索此id,如下所示:

public function rules()
{
    $businessId = $this->input('id');

    return [
        'name' => 'required|unique:businesses,name,'.$businessId,
        'url' => 'required|url|unique:businesses'
    ];
}

我认为这个答案比被采纳的答案更简单。 - Anderson Madeira

5

对于那些切换到 Laravel 5 的人:

public function rules()
{
    $business = $this->route('business');
    // rest of the code
}

1
在 Laravel 5.5 及以上版本(未检查较旧版本),一旦进行了显式绑定(https://laravel.com/docs/5.5/routing#route-model-binding),您可以通过 $this 直接获取您的模型。
class StoreBussiness extends FormRequest
{

    public function rules()
    {
        $rules = [];
        if ($this->type === 'a') {
        }

        return rules;
    }
}

1
假设我们有这样一个场景:我们想根据传递给路由的type更改验证规则。例如:
app.dev/business/{type}

针对不同类型的业务,我们有不同的验证规则。我们只需要在控制器方法中对请求进行类型提示即可。
public function store(StoreBusiness $request)
{
    // The incoming request is valid...
}

针对自定义表单请求。
class StoreBussiness extends FormRequest
{

    public function rules()
    {
        $type = $this->route()->parameter('type');

        $rules = [];
        if ($type === 'a') {
        }

        return rules;
    }
}

1

自 Laravel 5.6 起,您可以在 rules 方法中使用类型提示:

public function rules(Business $business)
{
    return [
        'name' => 'required|unique:businesses,name,'.$business->id,
        'url' => 'required|url|unique:businesses'
    ];
}

更多信息请参见文档

您可以在rules方法的签名中对所需的任何依赖项进行类型提示。它们将通过Laravel服务容器自动解析。


例如,如果您在BusinessController.php上有public function update(BusinessUpdateRequest $request, Business $business) {...},那么您如何将$business传递到BusinessUpdateRequest.php中,以便您可以像在示例中一样在“rules”方法中使用此参数? - zacktagnan
@zacktagnan,你需要将$business绑定到服务器容器中。它会自动解析 :) - Adam
Adam... 抱歉,我不知道如何将"$business绑定到服务器容器"。你能举个例子吗? - zacktagnan
1
@zacktagnan 创建一个服务提供者并绑定你的类。请阅读https://laravel.com/docs/7.x/container和https://laravel.com/docs/7.x/providers#the-register-method以开始。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接