首页 > 解决方案 > Laravel 5.7:自定义验证规则。不能使用注入到构造函数的类

问题描述

php artisan make:rule我通过执行查询创建了新规则,以进行一些自定义验证。

因此,在规则中,我创建了一个构造函数并注入了存储库,就像我过去在整个应用程序中所做的数十次一样。

class UniqueWishListNameByUser implements Rule
{
    private $wishListRepository;

    public function __construct(
        WishListRepository $wishListRepository
    ) {
        $this->wishListRepository = $wishListRepository;
    }
}

但是在passes方法中我不能使用注入的类。

public function passes($attribute, $value)

函数 App\Rules\UniqueWishListNameByUser::__construct() 的参数太少,在第 31 行的 /home/vagrant/code/ios-portal/app/Http/Requests/Frontend/WishList/CreateWishListRequest.php 中传递了 0,而预期的正是 1

这是因为当我调用规则时,它希望我自己注入类。

public function rules()
{
    return [
        'name' => [
            'required',
            'string',
            new UniqueWishListNameByUser(), // <--- here no args.
        ],
    ];
}

我应该在其他地方注入该类,还是应该通过调用app()->make()我不想做的调用来调用存储库类,除非我必须这样做。

我错过了什么吗?

编辑:

下面的代码有效,但我想使用依赖注入,如何?

$wishlistRepository = app()->make(WishListRepository::class);

$exists = $wishlistRepository
    ->where('user_id', auth()->user()->id)
    ->where('customer_uuid', auth()->user()->defaultCustomer->uuid)
    ->where('name', $value)
    ->exists();

标签: phplaravel

解决方案


rules您可以在表单请求的方法中注入自定义规则,如下所示:

public function rules(UniqueWishListNameByUser $unique)
{
    return [
        'name' => [
            'required',
            'string',
            $unique
        ],
    ];
}

来自 Laravel 的文档

您可以在rules方法的签名中键入提示您需要的任何依赖项。它们将通过 Laravel 服务容器自动解析。


推荐阅读