- implode: documentation ( source)
<?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;
}