decodelabs/tightrope

Reusable constraints for your PHP classes

v0.2.0 2025-02-11 18:44 UTC

This package is auto-updated.

Last update: 2025-02-14 17:22:09 UTC


README

PHP from Packagist Latest Version Total Downloads GitHub Workflow Status PHPStan License

Reusable constraints for your PHP classes.

Tightrope is a middleware package that provides library developers with a set of reusable semantic constraints.

Get news and updates on the DecodeLabs blog.

Installation

composer require decodelabs/tightrope

Usage

Tightrope defines a number of reusable interfaces that represent a property of an object, such as being disableable, readable or requirable:

namespace DecodeLabs\Tightrope;

interface Nullable {
    public function isNullable(): bool;
}

It also supplies a manifest version of each interface along with a trait implementation:

namespace DecodeLabs\Tightrope\Manifest;

use DecodeLabs\Tightrope\Nullable as StaticNullable;

interface Nullable extends StaticNullable {
    public function setNullable(bool $flag): static;
}

You can use these interfaces to define properties of your objects:

namespace My\Project;

use DecodeLabs\Exceptional;
use DecodeLabs\Tightrope\Manifest\Nullable;
use DecodeLabs\Tightrope\Manifest\NullableTrait;

class MyClass implements Nullable {

    use NullableTrait;

    public function doSomething(?string $value): void {
        if(
            !$this->isNullable() &&
            $value === null
        ) {
            throw Exceptional::InvalidArgument(
                message: 'Value cannot be null'
            );
        }

        // ...
    }
}

$myObject = new MyClass();

$myObject->setNullable(true);
$myObject->doSomething(null); // Fine

$myObject->setNullable(false);
$myObject->doSomething(null); // Not fine

Available properties

The following interfaces are currently available:

  • Disableable
  • Immutable
  • Nullable
  • Readable
  • ReadOnlyable
  • Requirable
  • Writable

Licensing

Tightrope is licensed under the MIT License. See LICENSE for the full license text.