chuk-shirley
5/8/2015 - 2:58 PM

Value Objects

Value Objects

<?php
namespace Sabel;

use Sabel\AbstractValueInterface;

class SystemReferenceNumberValue
{
    private $value;
    
    private function __construct(){}
    
    public function getValue()
    {
        return $this->value;
    }
    
    // Use named constructors
    public static function fromString($string)
    {
        $number = new SystemReferenceNumberValue;
        $number->setValue($string);
        $number->filter()->validate();
        return $number;
    }

    protected function filter()
    {
        $this->setValue(trim($this->value));
        return $this;
    }
    
    private function validate()
    {
        // Ensure value is within allowed range
        if ($this->value <= 0)
        {
            throw new \InvalidArgumentException("System reference number must be a positive integer");
        }
        elseif ($this->value > 999999999)
        {
            throw new \InvalidArgumentException("System reference number cannot be greater than 999999999");
        }
        
        return $this;
    }
    
    private function setValue($value)
    {
        // Ensure value is an integer
        $this->value = (int) $value;
    }
}
<?php
namespace Sabel;

class MyController
{
    public function myMethod($data)
    {
        SysemReferenceNumberValue::fromString($data['systemReferenceNumber']);
        
        // Use SystemReferenceNumber value object from here on out
    }
}