jcrowe/type-safe-collection

A thin wrapper around Illuminate/Collection that allows for enforcing type constraints on the collection elements

v7.1 2020-05-05 19:09 UTC

This package is auto-updated.

Last update: 2024-03-06 03:24:45 UTC


README

Build Status Coverage Status

TypeSafeCollection is a thin wrapper around Illuminate's Collection object that allows for easy enforcement of type protection in your collections.

use JCrowe\TypeSafeCollection\TypeSafeCollection;

class MovieLibrary extends TypeSafeCollection {

    // list of classes that can be added to the collection
    protected $allowedClasses = [Watchable::class, Rentable::class];
}

$myLibrary = new MovieLibrary([
    new WatchableMovie(),
    new RentableDVD(),
    new ReadableBook() // throws \InvalidArgumentProvided exception
]);


$myLibrary = new MovieLibrary();

$myLibarry->push(new RentableDVD());

$myLibrary->push(new ReadableBook()); // throws \InvalidArgumentProvided exception 

Custom checks

class MovieLibrary extends TypeSafeCollection {

    // list of classes that can be added to the collection
    protected $allowedClasses = [Watchable::class, Rentable::class];
    
    
    // this function will be called whenever a new  
    // element is being added to the collection
    protected function onAddNewElement($element) 
    {
        if (!$element->isAvailable()) {
            
            return false; // or throw exception
        }
    }
}

Ignore invalid types and do not throw exception

class MovieLibrary extends TypeSafeCollection {

    // list of classes that can be added to the collection
    protected $allowedClasses = [Watchable::class, Rentable::class];
    
    // if set to true no exception will be thrown when
    // attempting to add an invalid value.
    protected $ignoreInvalidElements = true;
}

$myLibrary = new MovieLibrary();

$myLibrary->put('my_rentable', new RentableDVD());

$myLibrary->get('my_rentable'); // RentableDVD object

$myLibrary->put('my_readable', new ReadableBook()); // no exception is thrown

$myLibrary->get('my_readable'); // null

Installation

composer require jcrowe/type-safe-collection
{
    "require": {
        "jcrowe/type-safe-collection": "~1.0"
    }
}