- Criei uma exceção personalizada NomeInvalidoException para tratar o nome.
- Lancei essa exceção na classe Pessoa, no método validaNome.
- Aproveitei a exceção InvalidArgumentException para cpf com formato inválido na classe CPF.
- Refatorei o arquivo teste-deposito.php para capturar todas as exceções apresentadas aqui.
Vejam como ficaram os arquivos:
<?php
namespace Alura\Banco\Modelo;
class NomeInvalidoException extends \DomainException
{
public function __construct(string $nome)
{
$sizeString = strlen($nome);
$message = "Nome do Titular deve ter ao menos 5 caracteres, '$nome' tem tamanho de $sizeString!";
parent::__construct($message);
}
}
Classe Pessoa:
final protected function validaNome(string $nome)
{
if (strlen($nome) < 4){
throw new NomeInvalidoException($nome);
}
}
Classe CPF:
public function __construct(string $cpf)
{
$cpf = filter_var($cpf, FILTER_VALIDATE_REGEXP, [
'options' => [
'regexp' => '/^[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}$/'
]
]);
if ($cpf === false) {
throw new \InvalidArgumentException("Formato CPF inválido");
}
$this->cpf = $cpf;
}
E por fim o arquivo teste-deposito.php reescrito utilizando as exceções que vimos:
<?php
use Alura\Banco\Modelo\Conta\ContaCorrente;
use Alura\Banco\Modelo\Conta\Titular;
use Alura\Banco\Modelo\CPF;
use Alura\Banco\Modelo\Endereco;
use Alura\Banco\Modelo\NomeInvalidoException;
require_once 'autoload.php';
try {
$contaCorrente = new ContaCorrente(
new Titular(
new CPF('123.456.789-10'),
'Jão',
new Endereco(
'Moc', 'Centro', 'Rua', '2022'
)
));
/*Aqui mantive o tratamento anterior para esse tipo de exceção.*/
try {
$contaCorrente->deposita(100);
} catch (InvalidArgumentException $exception) {
echo "Valor a depositar precisa ser positivo, ixpertinho!" . PHP_EOL;
}
echo $contaCorrente->recuperaSaldo();
/*Aqui eu usei o multi catch para as exceções.*/
} catch (InvalidArgumentException | NomeInvalidoException $exception) {
echo "Parametro incorreto: " . PHP_EOL;
echo $exception->getMessage();
}