PHPackages                             project-melody/validator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. project-melody/validator

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

project-melody/validator
========================

Set of Validation Rules

v1.1.3(11y ago)181266[7 issues](https://github.com/project-melody/validator/issues)BSD StylePHPPHP &gt;=5.3.3

Since Sep 20Pushed 9y ago3 watchersCompare

[ Source](https://github.com/project-melody/validator)[ Packagist](https://packagist.org/packages/project-melody/validator)[ Docs](https://github.com/project-melody/validator)[ RSS](/packages/project-melody-validator/feed)WikiDiscussions master Synced 3d ago

READMEChangelogDependencies (1)Versions (11)Used By (0)

Melody Validator
================

[](#melody-validator)

[![Build Status](https://camo.githubusercontent.com/3859801b753892d68886824604529f072ee7715273e3fb11262a7ed497101fb3/68747470733a2f2f7365637572652e7472617669732d63692e6f72672f70726f6a6563742d6d656c6f64792f76616c696461746f722e706e67)](http://travis-ci.org/project-melody/validator) [![Stories in Ready](https://camo.githubusercontent.com/c4a2abec734e3e781a02d8d6d4180a13321b6dd9da4be1499845b7ebbcce2022/68747470733a2f2f62616467652e776166666c652e696f2f70726f6a6563742d6d656c6f64792f76616c696461746f722e706e673f6c6162656c3d7265616479)](https://waffle.io/project-melody/validator)

Melody Validator is a set of validation rules with an easy way to customize validation groups. It works with PHP 5.3.3 or later.

- You can use chained validation like: v::email()-&gt;noWhitespace()-&gt;length(5,20)-&gt;validate("");
- You can set custom messages
- You can reuse the rules as you wish in a smart way
- You can load validation groups from YML and PHP files
- [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md) autoloading is compatible.

Installation
------------

[](#installation)

The recommended way to install Melody Validator is [through composer](http://getcomposer.org). Just create a `composer.json` file and run the `php composer.phar install` command to install it:

```
{
    "require": {
        "project-melody/validator": "dev-master"
    }
}

```

Introduction
------------

[](#introduction)

Importing Validator namespace:

```
use Melody\Validation\Validator as v;
```

Basic Usage
-----------

[](#basic-usage)

### Chained validation

[](#chained-validation)

```
$password = "pass@2012";
v::length(6, 12) // Length between 6 and 12 characters
    ->containsSpecial(1) // at least 1 special character
    ->containsLetter(3) // at least 3 letters
    ->containsDigit(2) // at least 2 digits
    ->validate($password); // true
```

### Getting violation messages

[](#getting-violation-messages)

```
$email = "test@mail.com";

$emailValidator = v::email();
$emailValidator->validate($email); //true

$violations = $emailValidator->getViolations(); //List all violation messages
```

### Constraints reuse

[](#constraints-reuse)

```
$username = "valid@username.com";
$validEmail = v::email();

//Reusing $validEmail constraint
$validUsername = $validEmail->add(v::maxLength(15)->minLength(5));
$validUsername->validate($username);//true
```

Rules
-----

[](#rules)

### Alnum

[](#alnum)

Only alphanumeric strings accepted:

```
$alnumValidator = v::alnum();
$alnumValidator->validate("valid"); //true
$alnumValidator->validate("#invalid"); //false
```

### Boolean

[](#boolean)

Only boolean accepted:

```
$booleanValidator = v::boolean();
$booleanValidator->validate(true); //true
$booleanValidator->validate(false); //true
$booleanValidator->validate("not a boolean"); //false
```

### ContainsDigit (integer $minimum)

[](#containsdigit-integer-minimum)

Minimum of digits (0-9) occurences in the input string:

```
$containsDigitValidator = v::containsDigit(3); // Minimum 3 digits
$containsDigitValidator->validate(123); //true
$containsDigitValidator->validate("12a"); //false
```

### ContainsLetter (integer $minimum)

[](#containsletter-integer-minimum)

Minimum of letters (a-z or A-Z) occurences in the input string:

```
$containsLetterValidator = v::containsLetter(1); // Minimum 1 letter
$containsLetterValidator->validate("123a"); //true
$containsLetterValidator->validate("1234"); //false
```

### ContainsSpecial (integer $minimum)

[](#containsspecial-integer-minimum)

Minimum of special characters occurences in the input string:

```
$containsSpecialValidator = v::containsSpecial(1); // Minimum 1 special character
$containsSpecialValidator->validate("123@"); //true
$containsSpecialValidator->validate("1234"); //false
```

### Email

[](#email)

Only valid emails accepted:

```
$emailValidator = v::email();
$emailValidator->validate("valid@email.com"); //true
$emailValidator->validate("invalid#@email.com"); //false
```

### Int

[](#int)

Asserts if the input is an integer:

```
$intValidator = v::int();
$intValidator->validate(1234); //true
$intValidator->validate("@"); //false
```

### IsArray

[](#isarray)

Asserts if the input is an array:

```
$isArrayValidator = v::isArray();
$isArrayValidator->validate(array()); //true
$isArrayValidator->validate(new \ArrayObject()); //true
$isArrayValidator->validate("not a array"); //false
```

### KeyExists

[](#keyexists)

Asserts if the key exists in the array:

```
$keyExistsValidator = v::keyExists("name");
$keyExistsValidator->validate(array("name" => "John Doe")); //true
$keyExistsValidator->validate(array("age" => 25)); //false
$keyExistsValidator->validate(array()); //false
```

### Length (integer $minLength, integer $maxLength)

[](#length-integer-minlength-integer-maxlength)

Ensures that the length of the string is between the min and max:

```
$lengthValidator = v::length(5, 10);
$lengthValidator->validate("Valid"); //true
$lengthValidator->validate("Invalid string"); //false
```

### Max (integer $input)

[](#max-integer-input)

Requires a given maximum number:

```
$maxValidator = v::max(10);
$maxValidator->validate(10); //true
$maxValidator->validate(11); //false
```

### Min (integer $min)

[](#min-integer-min)

Requires a given minimum number:

```
$minValidator = v::min(10);
$minValidator->validate(10); //true
$minValidator->validate(9); //false
```

### MaxLength (integer $max)

[](#maxlength-integer-max)

Validates if the string has the maximum length specified

```
$maxLengthValidator = v::maxLength(8);
$maxLengthValidator->validate("12345678"); //true
$maxLengthValidator->validate("123456789"); //false
```

### MinLength (integer $min)

[](#minlength-integer-min)

Validates if the string has the minimum length specified

```
$minLengthValidator = v::minLength(9);
$minLengthValidator->validate("123456789"); //true
$minLengthValidator->validate("12345678"); //false
```

### NotEmpty ()

[](#notempty-)

Validates if the input is not empty:

```
$notEmptyValidator = v::notEmpty();
$notEmptyValidator->validate("    "); //false
$notEmptyValidator->validate(null); //false
$notEmptyValidator->validate(new \stdClass); //true
$notEmptyValidator->validate("a   "); //true
```

### NoWhitespace ()

[](#nowhitespace-)

Validates if a string contains no whitespace:

```
$noWhitespaceValidator = v::noWhitespace();
$noWhitespaceValidator->validate("validstring"); //true
$noWhitespaceValidator->validate("invalid string"); //false
```

### Number ()

[](#number-)

Validates if the input is numeric:

```
$numberValidator = v::number();
$numberValidator->validate(1234); //true
$numberValidator->validate("not numeric"); //false
```

### Range (integer $min, integer $max)

[](#range-integer-min-integer-max)

Validates if a number is between the minimum and maxim specified:

```
$rangeValidator = v::range(5, 10);
$rangeValidator->validate(7); //true
$rangeValidator->validate(4); //false
```

### String ()

[](#string-)

Validates if the input is a string:

```
$stringValidator = v::string();
$stringValidator->validate("a generic string"); //true
$stringValidator->validate(1234); //false
```

Group Validation
----------------

[](#group-validation)

This is the input we will use as reference to test the validation group:

```
use Melody\Validation\Validator as v;
use Melody\Validation\ValidationGroups\ValidationGroupsFactory;

$input['name'] = "Marcelo Santos";
$input['email'] = "email@gmail.com";
$input['username'] = "marcelsud";
$input['password'] = "pass@2013";
```

### Load from array

[](#load-from-array)

```
use Melody\Validation\ValidationGroups\Parser\ArrayParser;

$config['registering'] = array(
        'name' => v::maxLength(50),
        'email' => v::email()->maxLength(50),
        'username' => v::length(6, 12)->alnum()->noWhitespace(),
        'password' => v::length(6, 12)->containsSpecial(1)->containsLetter(3)->containsDigit(2)->noWhitespace()
);

$validationGroups = ValidationGroupsFactory::build(new ArrayParser($config));
$validationGroups->validate($input, "registering"); // true
```

### Load from YAML file

[](#load-from-yaml-file)

```
# /path/to/validation.yml
registering:
    name: "maxLength:50"
    email: "email|maxLength:50"
    username: "length:6:12|alnum|noWhitespace"
    password : "length:6:12|containsSpecial:1|containsLetter:3|containsDigit:2|noWhitespace"
```

Validation:

```
use Melody\Validation\ValidationGroups\Parser\YamlParser;

$validationGroups = ValidationGroupsFactory::build(new YamlParser("/path/to/validation.yml"));
$validationGroups->validate($input, "registering"); // true
```

### Load from PHP file

[](#load-from-php-file)

```
// /path/to/validation.php
use Melody\Validation\Validator as v;

$config['registering'] = array(
    'name' => v::maxLength(50),
    'email' => v::email()->maxLength(50),
    'username' => v::length(6, 12)->alnum()->noWhitespace(),
    'password' => v::length(6, 12)->containsSpecial(1)->containsLetter(3)->containsDigit(2)->noWhitespace()
);

return $config;
```

Validation:

```
use Melody\Validation\ValidationGroups\Parser\PHPParser;

$validationGroups = ValidationGroupsFactory::build(new PHPParser("/path/to/validation.php"));
$validationGroups->validate($input, "registering"); // true
```

### Forge your own Validation Groups

[](#forge-your-own-validation-groups)

```
use Melody\Validation\Common\Collections\ConstraintsCollection;
use Melody\Validation\ValidationGroups\ValidationGroups;

$constraintsCollection = new ConstraintsCollection();
$constraintsCollection->set('name', v::maxLength(50));
$constraintsCollection->set('email', v::email()->maxLength(50));

$validationGroups = new ValidationGroups();
$validationGroups->add("updating", $constraintsCollection);

$validationGroups->validate($input, "updating"); // true

$validationGroups->has("updating"); // true
$validationGroups->remove("updating");
$validationGroups->has("registering"); // false
```

### Add custom violation messages

[](#add-custom-violation-messages)

```
$config['registering']['email'] = v::email()->maxLength(50);

$validationGroups = ValidationGroupsFactory::build(new ArrayParser($config));
$input['email'] = "email @gmail.com";

$validationGroups->validate($input, "registering", array(
        'email' => "'{{input}}' must be a valid email!"
));

$errors = $validationGroups->getViolations(); // Lists all the violation messages
var_dump($errors['email']); // string(45) "'email @gmail.com' must be a valid email!"
```

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance12

Infrequent updates — may be unmaintained

Popularity20

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 97% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~64 days

Recently: every ~93 days

Total

9

Last Release

4104d ago

Major Versions

v0.1.3 → v1.0.02014-02-09

### Community

Maintainers

![](https://www.gravatar.com/avatar/ed9b96477177da4105234a5e1ec4f35c214caff29f324278cabadfafc86e13e5?d=identicon)[marcelsud](/maintainers/marcelsud)

---

Top Contributors

[![marcelsud](https://avatars.githubusercontent.com/u/380226?v=4)](https://github.com/marcelsud "marcelsud (96 commits)")[![pcelta](https://avatars.githubusercontent.com/u/891198?v=4)](https://github.com/pcelta "pcelta (2 commits)")[![oandre](https://avatars.githubusercontent.com/u/5166386?v=4)](https://github.com/oandre "oandre (1 commits)")

---

Tags

phpvalidator

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/project-melody-validator/health.svg)

```
[![Health](https://phpackages.com/badges/project-melody-validator/health.svg)](https://phpackages.com/packages/project-melody-validator)
```

###  Alternatives

[webmozart/assert

Assertions to validate method input/output with nice error messages.

7.6k894.0M1.2k](/packages/webmozart-assert)[bensampo/laravel-enum

Simple, extensible and powerful enumeration implementation for Laravel.

2.0k15.9M104](/packages/bensampo-laravel-enum)[swaggest/json-schema

High definition PHP structures with JSON-schema based validation

48612.5M73](/packages/swaggest-json-schema)[stevebauman/purify

An HTML Purifier / Sanitizer for Laravel

5325.6M19](/packages/stevebauman-purify)[ashallendesign/laravel-config-validator

A package for validating your Laravel app's config.

217905.3k5](/packages/ashallendesign-laravel-config-validator)[crazybooot/base64-validation

Laravel validators for base64 encoded files

1341.9M8](/packages/crazybooot-base64-validation)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
