<?php
interface ErrorProvider extends IteratorAggregate
{
public function add(string $error) : ErrorProvider;
public function clear() : void;
public function hasErrors() : bool;
}
interface ValidationSubject
{
public function setErrorProvider(ErrorProvider $errorProvider) : void;
}
class ConcreteErrorProvider implements ErrorProvider
{
private $errorList = [];
public function add(string $errorMessage) : ErrorProvider
{
$this->errorList[] = $errorMessage;
return $this;
}
public function clear() : void
{
$this->errorList = [];
}
public function hasErrors() : bool
{
return (boolean)$this->errorList;
}
public function __toString() : string
{
return implode("\n" , $this->errorList);
}
public function getIterator() : \Iterator
{
return new ArrayIterator($this->errorList);
}
}
trait ValidationSubjectTrait
{
private $errorProvider;
public function setErrorProvider(ErrorProvider $errorProvider) : void
{
$this->errorProvider = $errorProvider;
}
protected function setErrorMessage(string $errorMessage) : void
{
//Caso não haja um ErrorProvider, será lançada uma exception como de costume
if (!$this->errorProvider instanceof ErrorProvider)
{
throw new \RuntimeException($errorMessage);
}
$this->errorProvider->add($errorMessage);
}
}
class Person implements ValidationSubject
{
use ValidationSubjectTrait;
/** método apenas para testes **/
public function setName($name) : void
{
$this->setErrorMessage("O nome não foi informado");
}
/** método apenas para testes **/
public function setLastName($lastName) : void
{
$this->setErrorMessage("O sobrenome não foi informado");
}
}
try
{
$person = new Person();
$person->setName('Gabriel');
$person->setLastName('Heming');
}
catch(Exception $exception)
{
echo $exception->getMessage();
}
echo "\n --------------------- \n";
$errorProvider = new ConcreteErrorProvider();
$person = new Person();
$person->setErrorProvider($errorProvider);
$person->setName('Gabriel');
$person->setLastName('Heming');
if ($errorProvider->hasErrors())
{
echo $errorProvider;
}
O nome não foi informado
---------------------
O nome não foi informado
O sobrenome não foi informado
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
O nome não foi informado
---------------------
O nome não foi informado
O sobrenome não foi informado