PHPackages                             cnastasi/functional-validators - 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. cnastasi/functional-validators

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

cnastasi/functional-validators
==============================

A PHP 8.5+ library implementing Value Objects with functional validation using pipes, functors, and union types

00PHPCI passing

Since Nov 25Pushed 5mo agoCompare

[ Source](https://github.com/cnastasi/functional-validators)[ Packagist](https://packagist.org/packages/cnastasi/functional-validators)[ RSS](/packages/cnastasi-functional-validators/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Functional Validators
=====================

[](#functional-validators)

A PHP 8.5+ library providing functional validation using the pipe operator (`|>`), functors, and union types. Perfect for building Value Objects with elegant, composable validation.

🎯 Overview
----------

[](#-overview)

This library provides a functional approach to Value Objects validation in PHP 8.5+. Instead of throwing exceptions on the first validation error, it accumulates all errors and returns them in a type-safe way using union types.

**Key Features:**

- ✅ **Functional Validation**: Uses PHP 8.5 pipes for elegant validation chains
- ✅ **Error Accumulation**: Collects all validation errors, not just the first one
- ✅ **Field-Level Errors**: For entities, errors are organized by field name
- ✅ **Type Safety**: Strong typing with union types (`ValueObject|ErrorsBag` or `Entity|MultipleFieldErrorsBag`)
- ✅ **Reusable Validators**: Library of composable validators

📚 Related Articles
------------------

[](#-related-articles)

This project is part of a blog series on Value Objects in PHP:

1. [Value Objects in PHP 8: Building a better code](https://dev.to/cnastasi/value-objects-in-php-8-building-a-better-code-38k8)
2. [Advanced Value Objects in PHP 8](https://dev.to/cnastasi/advanced-value-objects-in-php-8-1lp0)
3. [Value Object in PHP 8: Entities](https://dev.to/cnastasi/value-object-in-php-8-entities-1jce)
4. [Value Object in PHP 8: Build your own type system](https://dev.to/cnastasi/value-object-in-php-8-build-your-own-type-system-5970)
5. **[Value Objects in PHP 8: Let's introduce a functional approach](https://dev.to/cnastasi/value-objects-in-php-8-lets-introduce-a-functional-approach-3aan)** (this project)

📋 Requirements
--------------

[](#-requirements)

- PHP 8.5 or higher
- Composer

🚀 Installation
--------------

[](#-installation)

```
composer require cnastasi/functional-validators
```

Or add it manually to your `composer.json`:

```
{
    "require": {
        "cnastasi/functional-validators": "^0.1"
    }
}
```

💡 Quick Start
-------------

[](#-quick-start)

### Single Value Object

[](#single-value-object)

```
use CN\FunctionalValidators\Examples\Age;
use CN\FunctionalValidators\Errors\ErrorsBag;

$result = Age::create(25);
if ($result instanceof Age) {
    echo $result->value; // 25
} elseif ($result instanceof ErrorsBag) {
    foreach ($result->getErrors() as $error) {
        echo $error->message . "\n";
    }
}
```

### Entity with Multiple Fields

[](#entity-with-multiple-fields)

```
use CN\FunctionalValidators\Examples\Person;
use CN\FunctionalValidators\Errors\MultipleFieldErrorsBag;

$result = Person::create('', 'invalid-email', -5);
if ($result instanceof MultipleFieldErrorsBag) {
    foreach ($result->getErrorsByField() as $field => $errors) {
        echo "Field '{$field}':\n";
        foreach ($errors as $error) {
            echo "  - {$error->message}\n";
        }
    }
}
```

### Building Your Own Value Objects

[](#building-your-own-value-objects)

```
use CN\FunctionalValidators\Validators\IntegerValue;
use CN\FunctionalValidators\Errors\ErrorsBag;

readonly final class Price
{
    private function __construct(public int $value) {}

    public static function create(mixed $value): Price|ErrorsBag
    {
        $context = $value
            |> IntegerValue::from(...)
            |> IntegerValue::min(0, "Price cannot be negative")
            |> IntegerValue::max(100000, "Price cannot exceed 1000.00€");

        return $context->isValid()
            ? new self($context->getValue())
            : $context->getErrors();
    }
}
```

📖 **For detailed usage instructions, see [USAGE.md](USAGE.md)**

🏗️ Architecture
---------------

[](#️-architecture)

- **`CN\FunctionalValidators\Validators\`**: Core validation classes (`ValidationContext`, `MultipleValidationContext`, `IntegerValue`, `StringValue`)
- **`CN\FunctionalValidators\Errors\`**: Error handling (`ErrorsBag`, `MultipleFieldErrorsBag`, `Error`)
- **`CN\FunctionalValidators\Examples\`**: Example Value Objects (Age, Email, Name, Password, Person)

🧪 Testing
---------

[](#-testing)

```
composer test
```

📖 Documentation
---------------

[](#-documentation)

- **[Usage Guide](USAGE.md)**: Detailed guide on building your own Value Objects
- **[Blog Article](https://dev.to/cnastasi/value-objects-in-php-8-lets-introduce-a-functional-approach-3aan)**: Deep dive into the concepts and design decisions

🤝 Contributing
--------------

[](#-contributing)

Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

📝 License
---------

[](#-license)

This project is open-sourced software licensed under the [MIT license](LICENSE).

👤 Author
--------

[](#-author)

**Christian Nastasi**

- Blog: [dev.to/cnastasi](https://dev.to/cnastasi)
- Email:

🙏 Acknowledgments
-----------------

[](#-acknowledgments)

This project explores functional programming concepts in PHP, specifically:

- PHP 8.5 pipe operator (`|>`)
- Functors for error accumulation
- Union types instead of Either monads
- Reusable validator composition

⚠️ Note
-------

[](#️-note)

This is an experimental project exploring PHP 8.5 features. While functional and tested, it's primarily intended as a learning resource and proof of concept.

###  Health Score

17

—

LowBetter than 6% of packages

Maintenance48

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/10b75e2cb39cb0beafd94238c476a67ea60b23b102eb66d5068138a1114baa08?d=identicon)[cnastasi](/maintainers/cnastasi)

---

Top Contributors

[![cnastasi](https://avatars.githubusercontent.com/u/2204693?v=4)](https://github.com/cnastasi "cnastasi (10 commits)")

### Embed Badge

![Health badge](/badges/cnastasi-functional-validators/health.svg)

```
[![Health](https://phpackages.com/badges/cnastasi-functional-validators/health.svg)](https://phpackages.com/packages/cnastasi-functional-validators)
```

###  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)
