123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace Dotenv;
- use Dotenv\Exception\ValidationException;
- use Dotenv\Regex\Regex;
- /**
- * This is the validator class.
- *
- * It's responsible for applying validations against a number of variables.
- */
- class Validator
- {
- /**
- * The variables to validate.
- *
- * @var string[]
- */
- protected $variables;
- /**
- * The loader instance.
- *
- * @var \Dotenv\Loader
- */
- protected $loader;
- /**
- * Create a new validator instance.
- *
- * @param string[] $variables
- * @param \Dotenv\Loader $loader
- * @param bool $required
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return void
- */
- public function __construct(array $variables, Loader $loader, $required = true)
- {
- $this->variables = $variables;
- $this->loader = $loader;
- if ($required) {
- $this->assertCallback(
- function ($value) {
- return $value !== null;
- },
- 'is missing'
- );
- }
- }
- /**
- * Assert that each variable is not empty.
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return \Dotenv\Validator
- */
- public function notEmpty()
- {
- return $this->assertCallback(
- function ($value) {
- if ($value === null) {
- return true;
- }
- return strlen(trim($value)) > 0;
- },
- 'is empty'
- );
- }
- /**
- * Assert that each specified variable is an integer.
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return \Dotenv\Validator
- */
- public function isInteger()
- {
- return $this->assertCallback(
- function ($value) {
- if ($value === null) {
- return true;
- }
- return ctype_digit($value);
- },
- 'is not an integer'
- );
- }
- /**
- * Assert that each specified variable is a boolean.
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return \Dotenv\Validator
- */
- public function isBoolean()
- {
- return $this->assertCallback(
- function ($value) {
- if ($value === null) {
- return true;
- }
- if ($value === '') {
- return false;
- }
- return filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) !== null;
- },
- 'is not a boolean'
- );
- }
- /**
- * Assert that each variable is amongst the given choices.
- *
- * @param string[] $choices
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return \Dotenv\Validator
- */
- public function allowedValues(array $choices)
- {
- return $this->assertCallback(
- function ($value) use ($choices) {
- if ($value === null) {
- return true;
- }
- return in_array($value, $choices, true);
- },
- sprintf('is not one of [%s]', implode(', ', $choices))
- );
- }
- /**
- * Assert that each variable matches the given regular expression.
- *
- * @param string $regex
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return \Dotenv\Validator
- */
- public function allowedRegexValues($regex)
- {
- return $this->assertCallback(
- function ($value) use ($regex) {
- if ($value === null) {
- return true;
- }
- return Regex::match($regex, $value)->success()->getOrElse(0) === 1;
- },
- sprintf('does not match "%s"', $regex)
- );
- }
- /**
- * Assert that the callback returns true for each variable.
- *
- * @param callable $callback
- * @param string $message
- *
- * @throws \Dotenv\Exception\ValidationException
- *
- * @return \Dotenv\Validator
- */
- protected function assertCallback(callable $callback, $message = 'failed callback assertion')
- {
- $failing = [];
- foreach ($this->variables as $variable) {
- if ($callback($this->loader->getEnvironmentVariable($variable)) === false) {
- $failing[] = sprintf('%s %s', $variable, $message);
- }
- }
- if (count($failing) > 0) {
- throw new ValidationException(sprintf(
- 'One or more environment variables failed assertions: %s.',
- implode(', ', $failing)
- ));
- }
- return $this;
- }
- }
|