Поставщик сервера не загружен для пользовательского пакета

#laravel #package #service-provider

Вопрос:

Я создал файл packages/webgrig/restrict-wordlist-passwords/composer.json

 {
"name": "webgrig/restrict-wordlist-passwords",
"description": "A package to restrict users from using wordlist-based passwords",
"license": "MIT",
"version": "1.0.0",
"authors": [
    {
        "name": "webgrig",
        "email": "webgrig@gmail.com"
    }
],
"minimum-stability": "dev",
"require": {}
 

}

Затем в главном composer.json файле я написал следующие разделы

 "autoload": {
    "psr-4": {
        "App\": "app/",
        "Webgrig\RestrictWordlistPasswords\": "packages/webgrig/restrict-wordlist-passwords"
    },
    "classmap": [
        "database/seeds",
        "database/factories"
    ]
}
 

в разделе «Требуется» я написал свой пакет

  "require": {
    .....
    .....
    .....
    .....
    .....
    .....
    "webgrig/restrict-wordlist-passwords": "*"
}
 

а также в разделе репозитории я добавил следующее

 "repositories": [
    {
        "type": "path",
        "url": "packages/webgrig/restrict-wordlist-passwords/"
    }
]
 

Кроме того, я создал своего поставщика услуг packages/webgrig/restrict-wordlist-passwords/RestrictWordlistPasswordsProvider.php , в котором я расширяю класс валидатора и добавляю пользовательское правило проверки non_dictionary

 namespace WebgrigRestrictWordlistPasswords;

use IlluminateSupportServiceProvider;

class RestrictWordlistPasswordsProvider extends ServiceProvider
{
    ......
    ......
    ......
    ......
    public function boot()
    {
        Validator::extend('non_dictionary', function ($attribute, $value, $parameters, $validator){

            $dictionary = file(base_path(Config::get('nonDictionaryValidator.file', 'hak5.txt')));
            $dictionary = array_map('trim', $dictionary);

            return !in_array($value, $dictionary);

        });
    }
}
 

After that, I registered this service provider in the config/app.php

 'providers' => [
    .....
    .....
    .....
    .....
    IlluminateSessionSessionServiceProvider::class,
    IlluminateTranslationTranslationServiceProvider::class,
    IlluminateValidationValidationServiceProvider::class,
    IlluminateViewViewServiceProvider::class,

    /*
     * Package Service Providers...
     */

    WebgrigRestrictWordlistPasswordsRestrictWordlistPasswordsProvider::class,

    /*
     * Application Service Providers...
     */
    .....
    .....
    .....
    .....

]
 

After that I ran the command composer update and composer dump-autoload

In routes/web.php file I am accessing this service provider

 Route::get('test', function (){
    $data = [
        'password' => 'qwerty'
    ];

    $rules = [
        'password' => 'required|non_dictionary'
    ];
    $v = Validator::make($data, $rules);

    if ($v->fails()){
        dd($v->errors());
    }
});
 

But in the browser I am getting the following error

 Method IlluminateValidationValidator::validateNonDictionary does not exist.
 

But if I transfer this code from packages/webgrig/restrict-wordlist-passwords/RestrictWordlistPasswordsProvider.php to app/Providers/AppServiceProvider.php then everything works fine

 public function boot()
{
    Validator::extend('non_dictionary', function ($attribute, $value, $parameters, $validator){

        $dictionary = file(base_path(Config::get('nonDictionaryValidator.file', 'hak5.txt')));
        $dictionary = array_map('trim', $dictionary);

        return !in_array($value, $dictionary);

    });
}
 

Это указывает на то, что мой поставщик услуг не загрузился, так как именно здесь расширяется класс валидатора и добавляется новое non_dictionary правило проверки

Пожалуйста, скажите мне, что я делаю не так? В чем же ошибка?