#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
правило проверки
Пожалуйста, скажите мне, что я делаю не так? В чем же ошибка?