Separation of responsabilities on ProfaneValidator class
This commit is contained in:
parent
175b321868
commit
e2492d5dd4
|
|
@ -0,0 +1,91 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace LaravelProfane;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Config;
|
||||||
|
|
||||||
|
class Dictionary
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* [$dictionary description]
|
||||||
|
* @var [type]
|
||||||
|
*/
|
||||||
|
private $dictionary;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [__construct description]
|
||||||
|
* @param [type] $dictionary [description]
|
||||||
|
*/
|
||||||
|
function __construct($dictionary = null)
|
||||||
|
{
|
||||||
|
// Get default locale string in laravel project
|
||||||
|
// and set it as default dictionary
|
||||||
|
$locale = Config::has('app.locale') ? Config::get('app.locale') : 'en';
|
||||||
|
|
||||||
|
$this->setDictionary($dictionary ?: $locale);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [getDictionary description]
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
public function getDictionary()
|
||||||
|
{
|
||||||
|
return $this->dictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the dictionary to use
|
||||||
|
* @param array|string $dictionary
|
||||||
|
*/
|
||||||
|
public function setDictionary($dictionary)
|
||||||
|
{
|
||||||
|
$this->dictionary = $this->readDictionary($dictionary);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [readDictionary description]
|
||||||
|
* @param [type] $dictionary [description]
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
protected function readDictionary($dictionary)
|
||||||
|
{
|
||||||
|
$words = [];
|
||||||
|
$baseDictPath = $this->getBaseDictPath();
|
||||||
|
if (is_array($dictionary)) {
|
||||||
|
foreach ($dictionary as $file) {
|
||||||
|
if (file_exists($baseDictPath.$file.'.php')) {
|
||||||
|
$dict = include($baseDictPath.$file.'.php');
|
||||||
|
$words = array_merge($words, $dict);
|
||||||
|
} else {
|
||||||
|
// if the file isn't in the dict directory,
|
||||||
|
// it's probably a custom user library
|
||||||
|
$dict = include($file);
|
||||||
|
$words = array_merge($words, $dict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// just a single string, not an array
|
||||||
|
} elseif (is_string($dictionary)) {
|
||||||
|
if (file_exists($baseDictPath.$dictionary.'.php')) {
|
||||||
|
$dict = include($baseDictPath.$dictionary.'.php');
|
||||||
|
$words = array_merge($words, $dict);
|
||||||
|
} else {
|
||||||
|
if (file_exists($dictionary)) {
|
||||||
|
$dict = include($dictionary);
|
||||||
|
$words = array_merge($words, $dict);
|
||||||
|
} // else nothing is merged
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $words;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [getBaseDictPath description]
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
protected function getBaseDictPath()
|
||||||
|
{
|
||||||
|
return property_exists($this, 'baseDictPath') ? $this->baseDictPath : __DIR__ . DIRECTORY_SEPARATOR .'dict/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,11 +2,17 @@
|
||||||
|
|
||||||
namespace LaravelProfane;
|
namespace LaravelProfane;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Config;
|
use LaravelProfane\Dictionary;
|
||||||
use Illuminate\Contracts\Validation\Validator;
|
use Illuminate\Contracts\Validation\Validator;
|
||||||
|
|
||||||
class ProfaneValidator
|
class ProfaneValidator
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* [$dictionary description]
|
||||||
|
* @var [type]
|
||||||
|
*/
|
||||||
|
protected $dictionary;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [$badwords description]
|
* [$badwords description]
|
||||||
* @var array
|
* @var array
|
||||||
|
|
@ -15,14 +21,12 @@ class ProfaneValidator
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [__construct description]
|
* [__construct description]
|
||||||
|
* @param Dictionary $dictionary [description]
|
||||||
*/
|
*/
|
||||||
function __construct()
|
function __construct(Dictionary $dictionary)
|
||||||
{
|
{
|
||||||
// Get default locale string in laravel project
|
$this->dictionary = $dictionary;
|
||||||
// and set it as default dictionary
|
$this->badwords = $dictionary->getDictionary();
|
||||||
$locale_dict = Config::has('app.locale') ? Config::get('app.locale') : 'en';
|
|
||||||
|
|
||||||
$this->setDictionary($locale_dict);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -36,7 +40,8 @@ class ProfaneValidator
|
||||||
public function validate($attribute, $value, $parameters)
|
public function validate($attribute, $value, $parameters)
|
||||||
{
|
{
|
||||||
if ($parameters) {
|
if ($parameters) {
|
||||||
$this->setDictionary($parameters);
|
$this->dictionary->setDictionary($parameters);
|
||||||
|
$this->badwords = $this->dictionary->getDictionary();
|
||||||
}
|
}
|
||||||
|
|
||||||
return !$this->isProfane($value);
|
return !$this->isProfane($value);
|
||||||
|
|
@ -54,68 +59,4 @@ class ProfaneValidator
|
||||||
$this->badwords
|
$this->badwords
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* [getBadwords description]
|
|
||||||
* @return [type] [description]
|
|
||||||
*/
|
|
||||||
public function getBadwords()
|
|
||||||
{
|
|
||||||
return $this->badwords;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the dictionary to use
|
|
||||||
* @param array|string $dictionary
|
|
||||||
*/
|
|
||||||
public function setDictionary($dictionary)
|
|
||||||
{
|
|
||||||
$this->badwords = $this->readDictionary($dictionary);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [readDictionary description]
|
|
||||||
* @param [type] $dictionary [description]
|
|
||||||
* @return [type] [description]
|
|
||||||
*/
|
|
||||||
protected function readDictionary($dictionary)
|
|
||||||
{
|
|
||||||
$badwords = [];
|
|
||||||
$baseDictPath = $this->getBaseDictPath();
|
|
||||||
if (is_array($dictionary)) {
|
|
||||||
foreach ($dictionary as $file) {
|
|
||||||
if (file_exists($baseDictPath.$file.'.php')) {
|
|
||||||
$dict = include($baseDictPath.$file.'.php');
|
|
||||||
$badwords = array_merge($badwords, $dict);
|
|
||||||
} else {
|
|
||||||
// if the file isn't in the dict directory,
|
|
||||||
// it's probably a custom user library
|
|
||||||
$dict = include($file);
|
|
||||||
$badwords = array_merge($badwords, $dict);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// just a single string, not an array
|
|
||||||
} elseif (is_string($dictionary)) {
|
|
||||||
if (file_exists($baseDictPath.$dictionary.'.php')) {
|
|
||||||
$dict = include($baseDictPath.$dictionary.'.php');
|
|
||||||
$badwords = array_merge($badwords, $dict);
|
|
||||||
} else {
|
|
||||||
if (file_exists($dictionary)) {
|
|
||||||
$dict = include($dictionary);
|
|
||||||
$badwords = array_merge($badwords, $dict);
|
|
||||||
} // else nothing is merged
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $badwords;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [getBaseDictPath description]
|
|
||||||
* @return [type] [description]
|
|
||||||
*/
|
|
||||||
protected function getBaseDictPath()
|
|
||||||
{
|
|
||||||
return property_exists($this, 'baseDictPath') ? $this->baseDictPath : __DIR__ . DIRECTORY_SEPARATOR .'dict/';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace LaravelProfaneTests;
|
||||||
|
|
||||||
|
use LaravelProfane\Dictionary;
|
||||||
|
use LaravelProfaneTests\TestCase;
|
||||||
|
|
||||||
|
class DictionaryTest extends TestCase
|
||||||
|
{
|
||||||
|
public function test_words_from_only_one_locale()
|
||||||
|
{
|
||||||
|
$dictionary = new Dictionary('es');
|
||||||
|
|
||||||
|
$expected = include __DIR__.'/../src/dict/es.php';
|
||||||
|
|
||||||
|
$this->assertEquals($dictionary->getDictionary(), $expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_words_from_only_one_file()
|
||||||
|
{
|
||||||
|
$dictionary = new Dictionary(__DIR__.'/../src/dict/es.php');
|
||||||
|
|
||||||
|
$expected = include __DIR__.'/../src/dict/es.php';
|
||||||
|
|
||||||
|
$this->assertEquals($dictionary->getDictionary(), $expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_words_from_locale_array()
|
||||||
|
{
|
||||||
|
$dictionary = new Dictionary([
|
||||||
|
'es',
|
||||||
|
'gr'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$expected = array_merge(
|
||||||
|
include __DIR__.'/../src/dict/es.php',
|
||||||
|
include __DIR__.'/../src/dict/gr.php'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals($dictionary->getDictionary(), $expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_words_from_file_array()
|
||||||
|
{
|
||||||
|
$dictionary = new Dictionary([
|
||||||
|
__DIR__.'/../src/dict/es.php',
|
||||||
|
__DIR__.'/../src/dict/gr.php',
|
||||||
|
__DIR__.'/../src/dict/it.php',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$expected = array_merge(
|
||||||
|
include __DIR__.'/../src/dict/es.php',
|
||||||
|
include __DIR__.'/../src/dict/gr.php',
|
||||||
|
include __DIR__.'/../src/dict/it.php'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals($dictionary->getDictionary(), $expected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,53 +8,6 @@ use LaravelProfaneTests\Support\ProfaneValidatorBuilder;
|
||||||
|
|
||||||
class ProfaneValidatorTest extends TestCase
|
class ProfaneValidatorTest extends TestCase
|
||||||
{
|
{
|
||||||
public function test_can_set_dictionary_when_you_pass_a_locale()
|
|
||||||
{
|
|
||||||
$builder = new ProfaneValidatorBuilder('es');
|
|
||||||
|
|
||||||
$expected = include __DIR__.'/../src/dict/es.php';
|
|
||||||
|
|
||||||
$this->assertEquals($builder->build()->getBadwords(), $expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_can_set_dictionary_when_you_pass_a_file()
|
|
||||||
{
|
|
||||||
$builder = new ProfaneValidatorBuilder(__DIR__.'/../src/dict/es.php');
|
|
||||||
|
|
||||||
$expected = include __DIR__.'/../src/dict/es.php';
|
|
||||||
|
|
||||||
$this->assertEquals($builder->build()->getBadwords(), $expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_can_set_dictionary_when_you_pass_an_array_of_files()
|
|
||||||
{
|
|
||||||
$builder = new ProfaneValidatorBuilder([
|
|
||||||
__DIR__.'/../src/dict/es.php',
|
|
||||||
__DIR__.'/../src/dict/en.php'
|
|
||||||
]);
|
|
||||||
|
|
||||||
$expected = array_merge(
|
|
||||||
include __DIR__.'/../src/dict/es.php',
|
|
||||||
include __DIR__.'/../src/dict/en.php'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->assertEquals($builder->build()->getBadwords(), $expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_can_set_dictionary_when_you_pass_an_array_of_locales()
|
|
||||||
{
|
|
||||||
$builder = new ProfaneValidatorBuilder(['es', 'en', 'it', 'zh-tw']);
|
|
||||||
|
|
||||||
$expected = array_merge(
|
|
||||||
include __DIR__.'/../src/dict/es.php',
|
|
||||||
include __DIR__.'/../src/dict/en.php',
|
|
||||||
include __DIR__.'/../src/dict/it.php',
|
|
||||||
include __DIR__.'/../src/dict/zh-tw.php'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->assertEquals($builder->build()->getBadwords(), $expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_can_validate_a_word_with_numbers()
|
public function test_can_validate_a_word_with_numbers()
|
||||||
{
|
{
|
||||||
$builder = new ProfaneValidatorBuilder();
|
$builder = new ProfaneValidatorBuilder();
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace LaravelProfaneTests\Support;
|
namespace LaravelProfaneTests\Support;
|
||||||
|
|
||||||
use LaravelProfane\ProfaneValidator;
|
use LaravelProfane\ProfaneValidator;
|
||||||
|
use LaravelProfane\Dictionary;
|
||||||
|
|
||||||
class ProfaneValidatorBuilder
|
class ProfaneValidatorBuilder
|
||||||
{
|
{
|
||||||
|
|
@ -18,11 +19,7 @@ class ProfaneValidatorBuilder
|
||||||
*/
|
*/
|
||||||
public function __construct($dictionary = null)
|
public function __construct($dictionary = null)
|
||||||
{
|
{
|
||||||
$this->profaneValidator = new ProfaneValidator;
|
$this->profaneValidator = new ProfaneValidator(new Dictionary($dictionary));
|
||||||
|
|
||||||
if ($dictionary) {
|
|
||||||
$this->profaneValidator->setDictionary($dictionary);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue